Когда абстрактный класс без полей можно заменить интерфейсом в Java?

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

Ответ

Да, такой абстрактный класс почти всегда можно и нужно заменить интерфейсом, начиная с Java 8. Это соответствует принципу программирования на основе интерфейсов (interface-based design).

Прямая замена возможна, если:

  1. Класс не содержит полей (состояния).
  2. Класс не имеет реализованных методов (только абстрактные).
  3. Не требуется наследовать конструктор или логику инициализации.

Пример преобразования:

// Абстрактный класс (устаревший подход для этого случая)
abstract class Shape {
    abstract double calculateArea();
    abstract double calculatePerimeter();
}

// Интерфейс (современный подход)
interface Shape {
    double calculateArea();
    double calculatePerimeter();
}

Преимущества использования интерфейса:

  • Множественное наследование: Класс может реализовать несколько интерфейсов.
  • Гибкость: Легче внедрять новые контракты в существующую иерархию.
  • Возможности Java 8+:
    • default-методы для добавления поведения без ломания реализаций.
    • static-методы для утилитарных функций.
    • Приватные методы (с Java 9) для разделения логики внутри интерфейса.

Когда оставить абстрактный класс? Если в будущем может появиться общее нестатическое поле или шаблонный метод с частичной реализацией, требующей наследования.