В каких случаях в ООП следует использовать ассоциацию между классами?

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

Ответ

Ассоциация — это связь между двумя классами, при которой объекты одного класса знают об объектах другого и могут с ними взаимодействовать. Она реализует отношение "имеет" (has-a) и предпочтительнее наследования, когда нет строгой иерархии "является" (is-a).

Основные виды и случаи применения:

Тип связи Описание Когда использовать Пример на Java
Агрегация Слабая связь, часть может существовать независимо от целого. Когда жизненный цикл объектов не связан. University имеет Professor. Университет может существовать без конкретного профессора.
Композиция Сильная связь, часть не может существовать без целого. Когда объект-часть является неотъемлемой составляющей объекта-целого. Car имеет Engine. Двигатель не имеет смысла без автомобиля.

Пример кода (Композиция):

class Car {
    private Engine engine; // Композиция: Engine создается и уничтожается с Car

    public Car() {
        this.engine = new Engine(); // Создание внутри класса-владельца
    }
}

class Engine { /* ... */ }

Почему это важно: Ассоциация (особенно композиция) повышает гибкость и переиспользуемость кода по сравнению с наследованием, уменьшает связность и следует принципу "предпочитайте композицию наследованию".