Assegnazione di variabili con nomi dinamici in Java


96

Vorrei assegnare un insieme di variabili in java come segue:

int n1,n2,n3;

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

Come posso ottenere questo risultato in Java?


1
Potresti chiarire la tua domanda?
Eng.Fouad

4
Hai bisogno di farlo per le variabili locali? Perché non gli elementi dell'array?
Ray Toal

@ Eng.Fouad: Voglio accedere dinamicamente alle variabili in base al loro nome.
Ashish Anand

@Ashish Anand stai significa stackoverflow.com/questions/6629995/...
mKorbel

Risposte:


111

Non è così che fai le cose in Java. Non ci sono variabili dinamiche in Java. Le variabili Java devono essere dichiarate nel codice sorgente 1 .

A seconda di ciò che stai cercando di ottenere, dovresti usare un array, a Listo a Map; per esempio

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);
}

È possibile utilizzare la riflessione per fare riferimento dinamicamente a variabili che sono state dichiarate nel codice sorgente. Tuttavia, solo questo funziona per le variabili che sono membri della classe (cioè campi statici e istanza). Non funziona per le variabili locali. Vedi l'esempio "veloce e sporco" di @ fyr.

Tuttavia, fare questo genere di cose inutilmente in Java è una cattiva idea. È inefficiente, il codice è più complicato e poiché ti affidi al controllo del runtime è più fragile. E questo non è "variabili con nomi dinamici". È meglio descritto come accesso dinamico a variabili con nomi statici.


1 - Questa affermazione è leggermente imprecisa. Se utilizzi BCEL o ASM, puoi "dichiarare" le variabili nel file bytecode. Ma non farlo! In questo modo giace la follia!


1
Grazie mille, ho ottenuto quello che stavo cercando. L'ultima parte (Map <String, integer>).
Ashish Anand

1
Va notato che anche se fosse possibile, non dovrebbe essere qualcosa che faresti effettivamente. Non ci guadagni nulla; perderai effettivamente la leggibilità. Se vuoi collegarli, usa Map<String, T>invece un , non iniziare a scherzare con il tuo codice effettivo.
Jeroen Vannevel

2
@JeroenVannevel - Questo è ciò che intendevo per "follia" :-)
Stephen C

35

Se vuoi accedere alle variabili in qualche modo dinamico puoi usare la riflessione. Tuttavia, la riflessione non funziona per le variabili locali. È applicabile solo per attributi di classe.

Un esempio approssimativo, veloce e sporco è questo:

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);
        }
    }
}

È necessario migliorare questo codice in vari modi, è solo un esempio. Anche questo non è considerato un buon codice.


3
Ottimo quando devi convertire il sensore event.values ​​[] di Android in un insieme di variabili. event.values ​​[] potrebbe avere una lunghezza da 1 a 6 ed è utile convertirlo, nel mio caso per un marshalling json senza array.
Farshid T

12

Quello che ti serve è chiamato array. Volevo scrivere il seguente codice:

int[] n = new int[4];

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

1
Non voglio usare gli array. Voglio accedere dinamicamente alle variabili (n1, n2, n3) a seconda di alcune condizioni.
Ashish Anand

10

Dovresti usare Listo arrayinvece

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

O

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

O anche meglio

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

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

7

Nomi variabili dinamici in Java
Non esiste una cosa del genere.

Nel tuo caso puoi usare array:

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

Per (name, value)coppie più generali , usaMap<>


4

Prova in questo modo:

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

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

4

Non lo fai. La cosa più vicina che puoi fare è lavorare con Maps per simularlo o definire i tuoi oggetti da gestire.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.