В Java, улучшенном для цикла, действительно ли безопасно предположить, что выражение, которое будет циклично выполнено, будет оценено только однажды?

Я рекомендовал бы смотреть на Проект и 960 Объединенных энергосистем .

Помимо выполнения сброса и включая CSS фиксирует для Internet Explorer, они оба дадут Вам легкое для работы с сеткой дизайна, которая будет заботиться о большой утомительной тонкой настройке при создании основанных на CSS разметок.

10
задан Pascal Thivent 21 April 2010 в 21:54
поделиться

3 ответа

О расширенном операторе for Спецификации языка Java пишут:

Расширенный оператор for имеет форма:

 EnhancedForStatement:
 for (Идентификатор типа VariableModifiersopt: выражение)

Выражение должно иметь тип Итерируемый , иначе он должен иметь тип массива (§10.1) или время компиляции возникает ошибка.

Область объявленной локальной переменной в части FormalParameter расширенный для утверждения (§14.14) содержащееся Заявление

Значение расширенного для заявление дается переводом на базовый для оператора .

Если тип Выражение является подтип Iterable , тогда пусть I будет тип выражения Выражение. iterator () . Расширенный оператор для эквивалентен к основному для утверждению форма:

 for (I #i = Expression.iterator (); # i.hasNext ();) {

 Идентификатор типа VariableModifiersopt = # i.next ();
 утверждение
}

Где #i генерируется компилятором идентификатор, отличный от любого другие идентификаторы (сгенерированные компилятором или иначе), которые входят в сферу действия (§6.3) в точке, где усилено для

В противном случае Выражение обязательно имеет тип массива T [] . Пусть L1 ... Lm - (возможно, пустая) последовательность этикетки, непосредственно предшествующие расширен для оператора . Тогда значение расширенного оператора for дается следующим основным для инструкция:

 T [] a = Выражение;
L1: L2: ... Lm:
for (int i = 0; i 

Где a и i генерируются компилятором идентификаторы, отличные от любых другие идентификаторы (сгенерированные компилятором или иначе), которые входят в объем точка, где усилено выражение для

Итак, в вашем случае genArray () возвращает не подтип Iterable , а тип массива, поэтому ваш расширенный оператор for будет эквивалентно следующему базовому оператору for :

String[] a = genArray();
...
for (int i = 0; i < a.length; i++) {
    String s = a[i];
    // ...
}

И genArray () , таким образом, будет вызываться только один раз (но принятый в настоящее время ответ частично неверен).

23
ответ дан 3 December 2019 в 14:34
поделиться

Java вызовет genArray () один раз, получит объект итератора и вызовет его несколько раз.

5
ответ дан 3 December 2019 в 14:34
поделиться

К нему следует привыкнуть только один раз - это то же самое, что назвать это:

  String[] strings = genArray();
  for (String s : strings) {
  ...
5
ответ дан 3 December 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: