Что вы выберете для реализации метода: интерфейс или абстрактный класс?

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

Ответ

Выбор зависит от конкретных требований к проектированию.

Выберите ИНТЕРФЕЙС, если:

  • Вам нужен контракт без реализации (чистая абстракция).
  • Требуется поддержка множественного «наследования» (класс может реализовать много интерфейсов).
  • Вы хотите определить функциональный интерфейс для использования с лямбда-выражениями.
  • Нет необходимости в общем состоянии (не-final полях) для всех реализаций.

Выберите АБСТРАКТНЫЙ КЛАСС, если:

  • У наследников есть общая реализация (шаблонный метод) или состояние (не-static поля).
  • Вам нужны модификаторы доступа protected для методов или полей, чтобы скрыть их от внешнего мира, но открыть для наследников.
  • Вы планируете расширять функциональность существующего класса (наследование).

Пример сравнения:

// Интерфейс: определяет контракт для возможности отрисовки
interface Drawable {
    void draw(); // Только сигнатура метода
}

// Абстрактный класс: предоставляет общую логику и состояние для фигур
abstract class Shape {
    protected String color; // Общее состояние для наследников

    abstract double area(); // Абстрактный метод, который нужно реализовать

    // Общая реализация (не-абстрактный метод)
    public String getColor() {
        return color;
    }
}

Современный подход (Java 8+): Интерфейсы с default-методами позволяют добавлять реализацию, что сокращает необходимость в абстрактных классах, но они по-прежнему не могут содержать не-final поля состояния.