Устарели ли анонимные классы в Java с появлением лямбда-выражений?

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

Ответ

Нет, анонимные классы не устарели, но их область применения сузилась. Лямбда-выражения заменили их только для реализации функциональных интерфейсов (интерфейсов с одним абстрактным методом).

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

Критерий Анонимный класс Лямбда-выражение
Интерфейс Любой интерфейс или абстрактный класс Только функциональный интерфейс (Runnable, Comparator и т.д.)
Количество методов Может реализовывать несколько методов Реализует ровно один абстрактный метод
Состояние Может иметь поля и сложную логику Не имеет состояния (только захват переменных)
Синтаксис Более многословный Лаконичный

Примеры:

// 1. Лямбда (заменяет анонимный класс для функционального интерфейса)
Runnable lambda = () -> System.out.println("Hello");

// 2. Анонимный класс всё ещё необходим для:
//    а) Интерфейса с несколькими методами
SomeInterface obj = new SomeInterface() {
    @Override
    public void method1() { /* ... */ }
    @Override
    public void method2() { /* ... */ } // Лямбда невозможна
};

//    б) Абстрактного класса
AbstractClass obj = new AbstractClass("arg") {
    @Override
    void abstractMethod() { /* ... */ }
};

//    в) Переопределения конкретного метода с добавлением логики
Thread thread = new Thread() {
    @Override
    public void run() {
        super.run();
        System.out.println("Дополнительная логика");
    }
};

Вывод: Используйте лямбды для @FunctionalInterface, а анонимные классы — для всех остальных случаев.