Ответ
Нет, анонимные классы не устарели, но их область применения сузилась. Лямбда-выражения заменили их только для реализации функциональных интерфейсов (интерфейсов с одним абстрактным методом).
Ключевые различия и сценарии использования:
| Критерий | Анонимный класс | Лямбда-выражение |
|---|---|---|
| Интерфейс | Любой интерфейс или абстрактный класс | Только функциональный интерфейс (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, а анонимные классы — для всех остальных случаев.