Назначение переменных с динамическими именами в Java
Я хотел бы назначить набор переменных в java следующим образом:
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
Как я могу достичь этого в Java?
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<>