Я хотел бы назначить набор переменных в java следующим образом:
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
Как я могу добиться этого на Java?
Я хотел бы назначить набор переменных в java следующим образом:
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
Как я могу добиться этого на Java?
Ответы:
В Java это не так. В Java нет динамических переменных. Переменные Java должны быть объявлены в исходном коде 1 .
В зависимости от того, чего вы пытаетесь достичь, вы должны использовать массив, a 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, вы можете «объявить» переменные в файле байт-кода. Но не делай этого! В этом безумие!
Map<String, T>
вместо этого, не начинайте возиться с вашим фактическим кодом.
Если вы хотите получить доступ к каким-то динамическим переменным, вы можете использовать отражение. Однако 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);
}
}
}
Вам нужно улучшить этот код различными способами, это всего лишь пример. Это также не считается хорошим кодом.
Вам нужен именованный массив. Я хотел написать такой код:
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);
}