Назначение переменных с динамическими именами в Java - PullRequest
87 голосов
/ 18 июля 2011

Я бы хотел назначить набор переменных в Java следующим образом:

int n1,n2,n3;

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

Как мне добиться этого в Java?

Ответы [ 7 ]

102 голосов
/ 18 июля 2011

Это не так, как вы делаете вещи в Java.В Java нет динамических переменных.Переменные Java должны быть объявлены в исходном коде 1 .

В зависимости от того, чего вы пытаетесь достичь, вы должны использовать массив, List или Map;Например,

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

Можно использовать отражение для динамического обращения к переменным, которые были объявлены в исходном коде.Однако этот только работает для переменных, которые являются членами класса (т. Е. Статические поля и поля экземпляров).Это не работает для локальных переменных.См. Пример «быстрого и грязного» @ fyr.

Однако делать такие вещи без необходимости в Java - плохая идея.Это неэффективно, код более сложен, и, поскольку вы полагаетесь на проверку во время выполнения, он более хрупок.И это не «переменные с динамическими именами».Это лучше описать как динамический доступ к переменным со статическими именами.


1 - Это утверждение немного неточно.Если вы используете BCEL или ASM, вы можете «объявить» переменные в файле байт-кода.Но не делай этого!Так лежит безумие!

30 голосов
/ 18 июля 2011

Если вы хотите получить доступ к каким-либо динамическим переменным, вы можете использовать отражение. Однако Reflection работает не для локальных переменных. Это применимо только для атрибутов класса.

Грубый, быстрый и грязный пример:

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

Вам нужно улучшить этот код различными способами, это только пример. Это также не считается хорошим кодом.

11 голосов
/ 18 июля 2011

То, что вам нужно, называется массивом.Я хотел написать следующий код:

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}
10 голосов
/ 18 июля 2011

Вы должны использовать List или array вместо

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

Или

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

Или еще лучше

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

//conditionally get 
map.get("n1");
6 голосов
/ 18 июля 2011

Имена динамических переменных в Java
Такой вещи не существует.

В вашем случае вы можете использовать массив:

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

Для более общего представления (name, value) пар, используйте Map<>

3 голосов
/ 18 июля 2011

Попробуйте так:

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

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }
2 голосов
/ 18 июля 2011

Ты не.Самое близкое, что вы можете сделать, это работать с Картами, чтобы имитировать это, или определять свои собственные Объекты для работы.

...