web-dev-qa-db-fra.com

Affectation de variables avec des noms dynamiques dans Java

J'aimerais assigner un ensemble de variables dans Java comme suit:

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}

Comment puis-je réaliser cela en Java?

87
Ashish Anand

Ce n'est pas comme ça qu'on fait les choses en Java. Il n'y a pas de variables dynamiques en Java. Java les variables doivent être déclarées dans le code source1.

Selon ce que vous essayez d'atteindre, vous devriez utiliser un tableau, un List ou un Map; par exemple.

int n[] = new int[3];
for (int i = 0; i < 3; i++) {
    n[i] = 5;
}

List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
    n.add(5);
}

Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
    n.put("n" + i, 5);
}

Il est possible d’utiliser la réflexion pour faire référence dynamiquement aux variables déclarées dans le code source. Cependant, ceci seulement fonctionne pour les variables membres de la classe (champs statiques et instances). Cela ne fonctionne pas pour les variables locales. Voir l'exemple "rapide et sale" de @ fyr.

Cependant, faire ce genre de choses inutilement dans Java est une mauvaise idée. C'est inefficace, le code est plus compliqué et, puisque vous comptez sur l'exécution, il est plus fragile. Et ce ne sont pas des "variables avec des noms dynamiques". Il est mieux décrit comme un accès dynamique à des variables avec des noms statiques.


1 - Cette affirmation est légèrement inexacte. Si vous utilisez BCEL ou ASM, vous pouvez "déclarer" les variables dans le fichier de code intermédiaire. Mais ne le fais pas! De cette façon se trouve la folie!

102
Stephen C

Si vous souhaitez accéder aux variables une sorte de dynamique, vous pouvez utiliser la réflexion. Cependant, Reflection ne fonctionne pas pour les variables locales. Cela ne s'applique qu'aux attributs de classe.

Voici un exemple approximatif rapide et sale:

public class T {
    public Integer n1;
    public Integer n2;
    public Integer n3;

    public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
            NoSuchFieldException {

        for (int i = 1; i < 4; i++) {
            T.class.getField("n" + i).set(this, 5);
        }
    }
}

Vous devez améliorer ce code de différentes manières, ce n'est qu'un exemple. Ce n'est pas non plus considéré comme un bon code.

30
fyr

Ce dont vous avez besoin est nommé tableau. Je voulais écrire le code suivant:

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}
11
AlexR

Vous devriez utiliser List ou array à la place

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

Ou

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;

Ou même mieux

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);

//conditionally get 
map.get("n1");
10
Jigar Joshi

Noms de variables dynamiques en Java
Il n'y a pas une telle chose.

Dans votre cas, vous pouvez utiliser array:

int[] n = new int[3];
for() {
 n[i] = 5;
}

Pour plus générale (name, value) paires, utilisez Map<>

6
Op De Cirkel

Essayez de cette façon:

    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }
3
user784540

Vous pas. La chose la plus proche que vous puissiez faire est de travailler avec Maps pour la simuler ou de définir vos propres objets à traiter.

2
everton