Чем this внутри лямбды отличается от this внутри анонимного класса?
- Чем лямбда отличается от анонимного класса — по семантике и по тому, во что она компилируется?
В лямбде this — окружающий объект: она не вводит своей области видимости. В анонимном классе this — сам анонимный объект, и его поля могут перекрывать внешние. Лямбда компилируется не в отдельный .class, а в invokedynamic + LambdaMetafactory; лямбда без захвата переиспользуется как один экземпляр.
- Лямбда — только для функционального интерфейса; анонимный класс — для любого класса или интерфейса
- В лямбде нельзя объявить переменную с именем, уже занятым снаружи
- Анонимный класс всегда держит ссылку на внешний объект — риск утечки
А ещё Лямбда со своим состоянием невозможна — нужен класс
Подробно
Лямбда — не «короткий анонимный класс»: она не вводит свой scope, поэтому this ссылается на окружающий объект, и транслируется через invokedynamic/LambdaMetafactory (без отдельного .class, без захвата — экземпляр может переиспользоваться). Анонимный класс компилируется в отдельный класс и создаёт новый объект, внутри которого this — он сам.
Что хотят услышать
- Различие this и области видимости.
- Способ компиляции.
- Когда нужен анонимный класс.
Частые ошибки
- Ожидать, что this в лямбде — сама лямбда.
- Считать лямбду просто синтаксическим сахаром над анонимным классом.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗В обоих this указывает на сам объект функции
- ✗В лямбде this всегда null
- ✓В лямбде this — окружающий объект, в анонимном классе — сам анонимный объект
- ✗В анонимном классе this — окружающий объект, а в лямбде — сама лямбда
Что спросят дальше
- Что такое invokedynamic в контексте лямбд?
- Когда лямбда без захвата переиспользуется?
- Почему захватываемая переменная обязана быть effectively final?
- Когда ссылка на метод предпочтительнее лямбды?
Разбор темы
- Лямбды и функциональные интерфейсы
SAM-интерфейсы, лямбда против анонимного класса, замыкания и effectively final, ссылки на методы и стандартные интерфейсы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.