Вопрос-ответ

Assigning variables with dynamic names in Java

Присвоение переменным динамических имен в Java

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

int n1,n2,n3;

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

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

Переведено автоматически
Ответ 1

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

В зависимости от того, чего вы пытаетесь достичь, вам следует использовать массив, List или a 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, вы можете "объявлять" переменные в файле байт-кода. Но не делайте этого! Этот путь - безумие!

Ответ 2

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

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

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

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

Ответ 3

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

int[] n = new int[4];

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

Вместо этого следует использовать 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