Mediumdesigncomposition

Чем композиция наследованию (composition over inheritance)?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Effective Java Item 18: «Favor composition over inheritance». Наследование (extends) связывает классы tightly: подкласс зависит от реализации суперкласса, изменения ломают подкласс. Composition — класс содержит ссылку на другой и делегирует.

// Наследование — хрупко (зависит от internals)
// class MySet extends HashSet<String> { ... }

// Composition — стабильнее и гибче
public class CountingSet<E> {
    private final Set<E> delegate = new HashSet<>();  // можно заменить реализацию
    private int addCount = 0;

    public boolean add(E e) {
        addCount++;
        return delegate.add(e);     // делегирование
    }
}
  • Инкапсуляция: зависим только от public API, а не от internals;
  • Гибкость: реализацию можно заменить в runtime (DI);
  • Можно «обернуть» функциональность — паттерн Decorator;
  • IS-A → наследование, HAS-A → composition.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.