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. Композицию стоит применять, когда есть чёткая причина «спрятать» создание объекта внутрь класса.