Назначение переменных с динамическими именами в Java


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

int n1,n2,n3;

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

Как я могу достичь этого в Java?

7 71

7 ответов:

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

в зависимости от того, что вы пытаетесь достичь, вы должны использовать массив,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-это плохая идея. Это неэффективно, код сложнее, и поскольку вы полагаетесь на проверку времени выполнения, Он более хрупок.

и это не "переменные с динамическими именами". Лучше описан динамический доступ к переменным со статикой имена.


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

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

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

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

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

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

int[] n = new int[4];

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

вы должны использовать 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");

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

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

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

дополнительные (name, value) пар, использовать Map<>

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

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

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