Объектно-ориентированное программирование (ООП) является краеугольным камнем создания надежных и поддерживаемых Java-приложений. Два важных концепта ООП, композиция и агрегация, часто вызывают путаницу. Оба представляют собой отношения «имеет-а» между объектами, но существенно различаются по своим последствиям и применению. В этой статье эти различия объясняются на практических примерах.
Содержание
- Композиция в Java
- Агрегация в Java
- Композиция против агрегации
- Работа с композицией в Java
- Работа с агрегацией в Java
Композиция в Java
Композиция, «сильное» отношение «имеет-а», обозначает отношение целое-часть, где жизненный цикл части полностью зависит от целого. Уничтожение целого также уничтожает его части; части не могут существовать независимо. Рассмотрим автомобиль: он состоит из двигателя, колес, дверей и т.д. Утилизация автомобиля приводит к утилизации этих компонентов.
В Java композиция обычно реализуется путем прямого создания экземпляров объектов-частей внутри класса объекта-целого. Объект-целое создает и управляет этими частями.
Агрегация в Java
Агрегация, «слабое» отношение «имеет-а», указывает на то, что часть может существовать независимо от целого. Объект-целое содержит ссылки на части, но их жизненные циклы не связаны напрямую. Например, университет «имеет» кафедру, но кафедра сохраняется, даже если университет закрывается.
В Java агрегация включает в себя хранение объектом-целым ссылок на объекты-части. Этими ссылками можно управлять отдельно. Части могут быть созданы до или после объекта-целого и переживать его уничтожение.
Композиция против агрегации
В таблице ниже суммированы основные различия:
Характеристика | Композиция | Агрегация |
---|---|---|
Отношение | Сильное «имеет-а» (целое-часть) | Слабое «имеет-а» |
Жизненный цикл | Жизненный цикл части зависит от жизненного цикла целого | Жизненный цикл части не зависит от жизненного цикла целого |
Владение | Объект-целое владеет и управляет частями | Объект-целое содержит ссылки на части |
Существование части | Часть не может существовать независимо | Часть может существовать независимо |
Реализация | Прямое создание экземпляров внутри объекта-целого | Ссылки на независимые объекты-части |
Работа с композицией в Java
Проиллюстрируем композицию на примере Car
, состоящего из Engine
:
class Engine {
public void start() { System.out.println("Engine started"); }
}
class Car {
private Engine engine;
public Car() {
this.engine = new Engine();
}
public void drive() {
engine.start();
System.out.println("Car driving");
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car();
myCar.drive();
}
}
Объект Engine
создается внутри класса Car
. Существование Engine
зависит от Car
.
Работа с агрегацией в Java
Теперь проиллюстрируем агрегацию на примере университета и его кафедр:
class Department {
private String name;
public Department(String name) { this.name = name; }
public String getName() { return name; }
}
class University {
private Department[] departments;
public University(Department[] departments) {
this.departments = departments;
}
public void printDepartments() {
for (Department dept : departments) {
System.out.println("Department: " + dept.getName());
}
}
}
public class Main {
public static void main(String[] args) {
Department cs = new Department("Computer Science");
Department math = new Department("Mathematics");
Department[] deps = {cs, math};
University uni = new University(deps);
uni.printDepartments();
}
}
University
содержит ссылки на объекты Department
. Объекты Department
существуют независимо и могут использоваться в других местах.
Понимание композиции и агрегации позволяет создавать более надежные, поддерживаемые и хорошо структурированные Java-приложения. Выбор зависит от требований к проектированию и желаемого управления жизненным циклом объектов.