Зачем в Java до сих пор используют анонимные классы?

«Зачем в Java до сих пор используют анонимные классы?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Анонимные классы остаются в Java, несмотря на появление лямбда-выражений, для решения специфических задач, где лямбды неприменимы или менее удобны.

Ключевые сценарии использования:

  1. Реализация интерфейса или класса с несколькими методами. Лямбды работают только с функциональными интерфейсами (один абстрактный метод).

    // Анонимный класс для интерфейса с двумя методами
    someObject.setListener(new SomeListener() {
        @Override
        public void onSuccess(Data data) { /* ... */ }
        @Override
        public void onError(Throwable t) { /* ... */ }
    });
  2. Расширение конкретного класса (не только интерфейса) с переопределением методов.

    Thread thread = new Thread() {
        @Override
        public void run() {
            System.out.println("Запущен анонимный потомок Thread");
        }
    };
  3. Инициализация объектов с нетривиальной логикой в конструкторе (использование инициализатора экземпляра).

    var list = new ArrayList<String>() {{
        add("One");
        add("Two");
        addAll(fetchInitialData());
    }};
  4. Создание экземпляра класса с аннотациями "на лету" (например, в тестах).

Сравнение с лямбда-выражениями: Критерий Анонимный класс Лямбда-выражение
Цель Реализация интерфейса или класса Реализация функционального интерфейса
Кол-во методов Любое Только один (функциональный интерфейс)
Ключевое слово this Ссылается на сам анонимный класс Ссылается на охватывающий класс
Синтаксис Более многословный Лаконичный

Вывод: Анонимные классы — это инструмент для создания одноразовых реализаций произвольных типов, тогда как лямбды — оптимизированный синтаксис для функциональных интерфейсов.