104 votes

Attribution de variables avec des noms dynamiques en Java

Je voudrais assigner un ensemble de variables en 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 ?

1 votes

Pourriez-vous clarifier votre question ?

7 votes

Vous devez faire cela pour les variables locales ? Pourquoi pas les éléments d'un tableau ?

0 votes

@ Eng.Fouad : Je veux accéder aux variables par leur nom de manière dynamique.

124voto

Stephen C Points 255558

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

En fonction de ce que vous essayez de réaliser, 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 dynamiser se référer à les variables qui ont été déclarées dans le code source. Cependant, cette uniquement fonctionne pour les variables qui sont des membres de classe (c'est-à-dire les champs statiques et d'instance). Cela ne fonctionne pas pour les variables locales. Voir l'exemple "rapide et sale" de @fyr.

Cependant, faire ce genre de choses inutilement en Java est une mauvaise idée. C'est inefficace, le code est plus compliqué et, comme vous vous appuyez sur la vérification à l'exécution, il est plus fragile. Et il ne s'agit pas de "variables avec des noms dynamiques". Il s'agit plutôt d'un accès dynamique à des variables portant 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 bytecode. Mais ne le faites pas ! C'est la folie !

1 votes

Merci beaucoup, j'ai trouvé ce que je cherchais. La dernière partie (Map<String, integer> ).

1 votes

Il convient de noter que, même si cela est possible, ce n'est pas quelque chose que vous feriez réellement. Vous n'y gagnerez rien et vous perdrez en lisibilité. Si vous voulez les lier, utilisez un Map<String, T> à la place, ne commencez pas à toucher à votre code actuel.

2 votes

@JeroenVannevel - C'est ce que je voulais dire par "folie" :-)

37voto

fyr Points 7756

Si vous voulez accéder aux variables de manière dynamique, vous pouvez utiliser la réflexion. Cependant, Reflection ne fonctionne pas pour les variables locales. Il n'est applicable que pour les attributs de classe.

Voici un exemple simple et rapide :

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 diverses manières ; ce n'est qu'un exemple. Ce n'est pas non plus considéré comme un bon code.

3 votes

Excellent lorsque vous avez besoin de convertir le capteur Android event.values[] en un ensemble de variables. event.values[] pourrait avoir une longueur de 1 à 6 et il est pratique de l'avoir converti, dans mon cas pour un marshaling json sans tableau.

13voto

AlexR Points 60796

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

int[] n = new int[4];

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

1 votes

Je ne veux pas utiliser de tableaux. Je veux accéder dynamiquement aux variables (n1,n2,n3) en fonction de certaines conditions.

12voto

Jigar Joshi Points 116533

Vous devez utiliser List ou array au lieu de

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 encore mieux

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

//conditionally get 
map.get("n1");

8voto

Op De Cirkel Points 8632

Noms de variables dynamiques en Java
Il n'y a rien de tel.

Dans votre cas, vous pouvez utiliser le tableau :

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

Pour des informations plus générales (name, value) paires, utilisez Map<>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X