2011-07-18 7 views
70

Chciałbym przypisać zestaw zmiennych w Java, co następuje:Przypisanie zmiennych z dynamicznymi nazwami w języku Java

int n1,n2,n3; 

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

Jak mogę to osiągnąć w Java?

+0

Czy możesz wyjaśnić swoje pytanie? –

+3

Musisz to zrobić dla zmiennych lokalnych? Czemu nie elementy tablicy? –

+0

@ Eng.Fouad: Chcę dynamicznie uzyskiwać dostęp do zmiennych według ich nazwy. –

Odpowiedz

87

To nie jest sposób, w jaki robisz rzeczy w Javie. W Javie nie ma zmiennych dynamicznych. Zmienne Java muszą być zadeklarowane w kodzie źródłowym (*). Kropka.

W zależności od tego, co próbujesz osiągnąć, powinieneś użyć tablicy, List lub Map; na przykład

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

Możliwe jest użycie odbicie dynamicznie patrz zmiennych, które zostały zadeklarowane w kodzie źródłowym. Jednak ten parametr tylko działa dla zmiennych, które są członkami klasy (tj. Polami statycznymi i instancjami). Nie działa dla zmiennych lokalnych. Zobacz przykład "szybki i brudny" @ fyr.

Jednak robienie tego niepotrzebnie w Javie jest złym pomysłem. Jest nieefektywny, kod jest bardziej skomplikowany, a ponieważ polegasz na sprawdzaniu w czasie wykonywania, jest on bardziej kruchy.

A to nie są "zmienne z nazwami dynamicznymi". Jest lepiej opisany dynamiczny dostęp do zmiennych o statycznych nazwach.


* - To stwierdzenie jest nieco niedokładne. Jeśli używasz BCEL lub ASM, możesz "zadeklarować" zmienne w pliku kodu bajtowego. Ale nie rób tego! W ten sposób leży szaleństwo!

+0

Bardzo dużo, dostałem to, czego szukałem. Ostatnia część (mapa ). –

+1

Należy zauważyć, że nawet gdyby było to możliwe, nie powinno to być coś, co faktycznie byś zrobił. Nic z tego nie zyskujesz; stracisz czytelność. Jeśli chcesz je połączyć, zamiast tego użyj 'Map ', nie zaczynaj się z prawdziwym kodem. –

+2

@JeroenVannevel - To właśnie miałem na myśli przez "szaleństwo" :-) –

9

Należy użyć List lub array zamiast

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

Albo

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

Albo jeszcze lepiej

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

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

Co trzeba nazywa się tablicą. Chciałem napisać następujący kod:

int[] n = new int[4]; 

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

Nie chcesz używać tablic . Chcę dynamicznie uzyskiwać dostęp do zmiennych (n1, n2, n3) w zależności od pewnych warunków. –

3

Dynamiczne nazw zmiennych w Java
Nie ma czegoś takiego.

W twoim przypadku można użyć tablicy:

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

Dla bardziej ogólnych (name, value) parach używać Map<>

3

Spróbuj w ten sposób:

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

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

Jeśli chcesz uzyskać dostęp do zmiennych niektóre rodzaj dynamiczny możesz użyć refleksji. Jednak Reflection działa nie dla zmiennych lokalnych. Można go stosować tylko w przypadku atrybutów klas.

A rough szybkie i brudne przykładem jest to:

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

Trzeba poprawić ten kod na różne sposoby to jest tylko przykładem. Nie jest to również uważane za dobry kod.

+2

Znakomicie, gdy trzeba przekonwertować sensor zdarzenia.values ​​[] na system Android w zestaw zmiennych. event.values ​​[] może mieć długość od 1 do 6 i wygodnie jest go przekonwertować, w moim przypadku na pozbawiony tablic json marshaling. –

2

Nie musisz. Najbliższą rzeczą, którą możesz zrobić, to pracować z Mapami, aby ją symulować, lub definiować własne Obiekty, z którymi możesz sobie poradzić.

Powiązane problemy