Что такое композиция в объектно-ориентированном программировании?

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

Ответ

Композиция — это принцип ООП, описывающий отношение «часть-целое» с сильной связью и совместным жизненным циклом. Объект-контейнер (целое) владеет объектом-компонентом (частью), создает его и управляет его временем жизни. Уничтожение контейнера влечет за собой уничтожение всех его компонентов.

Ключевой признак: Компонент не может существовать независимо от своего контейнера.

Пример на Java:

// Компонент
class Engine {
    void start() {
        System.out.println("Двигатель запущен.");
    }
}

// Контейнер
class Car {
    // Композиция: поле final, объект создается в конструкторе
    private final Engine engine;

    public Car() {
        this.engine = new Engine(); // Создание жизненного цикла
    }

    void drive() {
        engine.start();
        System.out.println("Машина поехала.");
    }
}
// При удалении объекта Car его Engine также будет удален сборщиком мусора.
Сравнение с агрегацией: Композиция Агрегация
Сильная связь («содержит-в»). Слабая связь («имеет-в»).
Жизненный цикл частей зависит от целого. Части могут существовать независимо.
Части создаются внутри целого. Части передаются целому извне (через конструктор/сеттер).

Преимущество: Повышает инкапсуляцию и управляемость зависимостей.