Страницы

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

четверг, 11 апреля 2019 г.

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

Есть класс 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)?


Ответ

Возьмём следующий код:
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 абсолютно верно, предложенный ею код эквивалентен исходному.

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

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