Gymterview
junior

В чем разница между композицией и агрегацией?

Ассоциация обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое».

Композиция — вложенный объект не может существовать без владельца (владелец создаёт и уничтожает его):

Пример
class Engine {
    private final int horsepower;

    Engine(int horsepower) {
        this.horsepower = horsepower;
    }
}

class Car {
    private final Engine engine; // Engine живёт и умирает вместе с Car

    Car(int horsepower) {
        this.engine = new Engine(horsepower); // Car сам создаёт Engine
    }
}

Агрегация — вложенный объект существует независимо, передаётся извне:

Пример
class Driver {
    private final String name;

    Driver(String name) {
        this.name = name;
    }
}

class Car {
    private Driver driver; // Driver может существовать без Car

    Car(Driver driver) {
        this.driver = driver; // Car получает Driver извне
    }
}

Коротко: если new внутри класса — композиция, если объект приходит снаружи — агрегация.

Предпочтительнее использовать агрегацию и внедрять зависимости через конструктор. Это автоматически делает код тестируемым и следует принципу Dependency Inversion из SOLID. Композицию стоит применять, когда есть чёткая причина «спрятать» создание объекта внутрь класса.