Java Core middle

Лямбда-выражения: почему переменные должны быть effectively final?

Ответ

Лямбда захватывает копию значения переменной, не ссылку на неё. Если переменная изменится после захвата — копия устареет → неочевидное поведение. Компилятор требует final или effectively final для защиты от ошибок.

Разбор: Лямбда захватывает копию значения локальной переменной (capture by value), а не ссылку на неё, поэтому изменение оригинала после захвата сделало бы копию рассогласованной — компилятор требует final/effectively final для устранения этой неоднозначности. Дистракторы подменяют причину: дело не в потокобезопасности, не в «статическом методе» и не в запрете кучи, а именно в семантике копирования значения.

Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.

Заказать гайд Пройти тест
новые гайды и свежие вопросы с собесов — первыми в Telegram Смотреть гайды Подписаться