Вызов переменной по имени, которая не известна при компиляции - PullRequest
4 голосов
/ 09 февраля 2010

Можно ли установить переменную, если я хочу, чтобы она была гибкой? Я думаю, что пример облегчает понимание.

String hallo1;
String hallo2;

for(int i = 0; i < 2; i++) {
 hallo & i = Integer.toString(i);
}

Ответы [ 5 ]

13 голосов
/ 09 февраля 2010

Нет, вы не можете. (К счастью) в Java нет такого понятия, как eval().

Лучше всего взять Array или ArrayList . Вот пример массива:

String[] hallos = new String[2];

for (int i = 0; i < 2; i++) {
    hallos[i] = Integer.toString(i);
}
4 голосов
/ 09 февраля 2010

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

РЕДАКТИРОВАТЬ:
Как подчеркивались комментарии:

  1. Чтобы уточнить, я настоятельнопредложить не , чтобы поддаться искушению использовать отражение.Другие ответы указывают на лучшие способы достижения вашей цели, такие как массив.
  2. Отражение не поможет вам с локальными переменными.
2 голосов
/ 09 февраля 2010

Если вам действительно нужны переменные с именами, неизвестными во время компиляции, вы можете добиться этого эффекта, создав структуру, которая содержит произвольные имена и значения. Например, вы можете создать HashMap, где ключом является имя. Тогда ваш пример выше станет примерно таким:

  HashMap myData=new HashMap();
  for (int i=0;i<2;++i)
  {
    myData.put("hallo"+i,Integer.toString(i));
  }

Позже вы вытащите их с помощью:

  String whatever=myData.get("hallo1");

и т.д.

Конечно, вы не можете получить доступ к значениям с карты как к переменным напрямую, вам всегда нужно было бы помещать и получать их для обновления и извлечения, но концепция та же.

Тем не менее, я буду очень осторожен с этим, потому что это затрудняет поддержку кода. Если нужные вам имена действительно появляются неожиданно - если вы пишете универсальный код для чтения произвольной таблицы базы данных, имя которой было введено пользователем во время выполнения или что-то в этом роде - круто. Но если вы думаете, что это удобный ярлык для чего-то вроде:

  if (region.equals("1"))
    region1Total+=amount;
  else
    region2Total+=amount;

Мой простой ответ - НЕ !! Код гораздо проще поддерживать, если вы используете оператор IF и обычные переменные. Тогда любой, кто читает код, может просмотреть ваши объявления и посмотреть, какие есть все возможные переменные. Вы можете сделать поиск текста, чтобы найти везде, где они используются. Если вы неправильно написали имя переменной, вместо волшебного создания новой переменной вы получите чистое сообщение об ошибке во время компиляции. И т.д.

С другой стороны, если вы МОЖЕТЕ написать что-то вроде

  String n=getInputFromScreen();
  String s=getAnotherInputFromScreen();
  hallo & n = s;

вы бы не знали, какие переменные существуют в вашей программе, и не могли бы отследить, где они используются.

0 голосов
/ 09 февраля 2010

Вы можете использовать массив строк.
Что-то вроде:

 String[] hallos = new String[10];

 //when looping you can use regular (counter) loop or for each loop
 for (String s: hallos){
       //do whatever you want with each String
 }
0 голосов
/ 09 февраля 2010

Нет, способ сделать что-то подобное с помощью массива, списка или чего-то подобного. Также более интуитивно сгруппировать их вместе, чем иметь множество переменных (которые действительно должны быть связаны). Нет способа сделать это - по крайней мере, на Java. Я видел это в скриптовых языках, но это совсем другое ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...