Ответ
Анонимные классы остаются в Java, несмотря на появление лямбда-выражений, для решения специфических задач, где лямбды неприменимы или менее удобны.
Ключевые сценарии использования:
-
Реализация интерфейса или класса с несколькими методами. Лямбды работают только с функциональными интерфейсами (один абстрактный метод).
// Анонимный класс для интерфейса с двумя методами someObject.setListener(new SomeListener() { @Override public void onSuccess(Data data) { /* ... */ } @Override public void onError(Throwable t) { /* ... */ } }); -
Расширение конкретного класса (не только интерфейса) с переопределением методов.
Thread thread = new Thread() { @Override public void run() { System.out.println("Запущен анонимный потомок Thread"); } }; -
Инициализация объектов с нетривиальной логикой в конструкторе (использование инициализатора экземпляра).
var list = new ArrayList<String>() {{ add("One"); add("Two"); addAll(fetchInitialData()); }}; -
Создание экземпляра класса с аннотациями "на лету" (например, в тестах).
| Сравнение с лямбда-выражениями: | Критерий | Анонимный класс | Лямбда-выражение |
|---|---|---|---|
| Цель | Реализация интерфейса или класса | Реализация функционального интерфейса | |
| Кол-во методов | Любое | Только один (функциональный интерфейс) | |
Ключевое слово this |
Ссылается на сам анонимный класс | Ссылается на охватывающий класс | |
| Синтаксис | Более многословный | Лаконичный |
Вывод: Анонимные классы — это инструмент для создания одноразовых реализаций произвольных типов, тогда как лямбды — оптимизированный синтаксис для функциональных интерфейсов.