Attribution de variables avec des noms dynamiques en Java

96

Je voudrais attribuer 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 y parvenir en Java?

Ashish Anand
la source
1
Pouvez-vous clarifier votre question?
Eng.Fouad
4
Vous devez faire cela pour les variables locales? Pourquoi pas des éléments de tableau?
Ray Toal
@ Eng.Fouad: Je souhaite accéder dynamiquement aux variables par leur nom.
Ashish Anand
@Ashish Anand voulez-vous dire stackoverflow.com/questions/6629995/…
mKorbel

Réponses:

111

Ce n'est pas ainsi que vous faites 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 devez utiliser un tableau, a Listou a 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 à des variables qui ont été déclarées dans le code source. Cependant, cela seulement fonctionne que pour les variables qui sont membres de la 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 chose inutilement en Java est une mauvaise idée. C'est inefficace, le code est plus compliqué, et comme vous comptez sur la vérification à 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 aux variables avec des noms statiques.


1 - Cette déclaration est légèrement inexacte. Si vous utilisez BCEL ou ASM, vous pouvez «déclarer» les variables dans le fichier bytecode. Mais ne le fais pas! De cette façon, c'est la folie!

Stephen C
la source
1
Merci beaucoup, j'ai obtenu ce que je cherchais. La dernière partie (Map <String, integer>).
Ashish Anand
1
Il convient de noter que même si cela était possible, ce ne devrait pas être quelque chose que vous feriez réellement. Vous n'y gagnez rien; vous perdrez en fait la lisibilité. Si vous souhaitez les lier, utilisez Map<String, T>plutôt un , ne commencez pas à jouer avec votre code réel.
Jeroen Vannevel
2
@JeroenVannevel - C'est ce que j'entendais par «folie» :-)
Stephen C
35

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

Un exemple rapide et sale est le suivant:

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.

fyr
la source
3
Excellent lorsque vous devez convertir le capteur event.values ​​[] d'Android en un ensemble de variables. event.values ​​[] pourrait avoir une longueur de 1 à 6 et il est pratique de le convertir, dans mon cas pour un marshaling json sans tableau.
Farshid T
12

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

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}
AlexR
la source
1
Je ne veux pas utiliser de tableaux. Je veux accéder dynamiquement aux variables (n1, n2, n3) en fonction de certaines conditions.
Ashish Anand
10

Vous devriez utiliser Listou à la arrayplace

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");
Jigar Joshi
la source
7

Noms de variables dynamiques en Java
Une telle chose n'existe pas.

Dans votre cas, vous pouvez utiliser array:

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

Pour des (name, value)paires plus générales , utilisezMap<>

Op De Cirkel
la source
4

Essayez de cette façon:

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

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

la source
4

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

Everton
la source