Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Некорректный совет среды разработки или я неверно понимаю правила языка?

#java #intellij_idea #foreach


Есть класс Account обладающий списком ArrayList cardList.
В цикле мне требуется искать подходящий объект класса Card, и при соблюдении требуемых
параметров обновлять строку и обновлять сам объект класса Card из списка cardList.

for (int i = 0; i < cardList.size(); i++) {
 if (cardList.get(i).multi_parent != null && cardList.get(i).multi_parent.equals(multi_parentEntry)) {
     outputStr += cardList.get(i).balance;
     cardList.get(i).multi = true;
 }


}

Среда разработки Idea предупреждает, что  'for' loop replaceable with 'foreach'. 

Поясните, пожалуйста, в чем тут проблема? Если я верно понимаю предупреждение, среда
разработки предлагает использовать более компактный способ объявления цикла - foreach,
но тут возникает вопрос - разве при объявлении цикла подобным образом 

for (Card card: cardList) {
  if (card.multi_parent != null && card.multi_parent.equals(multi_parentEntry)) {
    outputStr += card.balance;
    card.multi = true;
  }
}


разве будет обновляться параметры объектов из списка (в моем случае каждый объект
класса Card из списка cardList)?
    


Ответы

Ответ 1



Возьмём следующий код: ArrayList cardList; for (Card card : cardList) { // . . . card.multi = true; } Фактически этот код эквивалентен следующему: ArrayList cardList; for (Iterator iter = cardList.iterator; iter.hasNext(); ) { Card card = iter.next(); // . . . card.multi = true; } На самом деле цикл foreach будет развёрнут в цикл с итераторами и foreach просто более короткая запись этого цикла. В коде с итераторами видно, что никаких копий элементов списка не создаётся, а в переменной card хранится ссылка на объект из списка. Поэтому изменение переменной card меняет элемент списка. Тем самым, предложение IntelliJ IDEA абсолютно верно, предложенный ею код эквивалентен исходному.

Комментариев нет:

Отправить комментарий