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 подскажет развёрнутый ответ в реальном времени.