A programação orientada a objetos (POO) é a pedra angular de aplicações Java robustas e fáceis de manter. Dois conceitos cruciais da POO, composição e agregação, frequentemente causam confusão. Ambos representam relações “tem-um” entre objetos, mas diferem significativamente em suas implicações e uso. Este artigo esclarece essas diferenças por meio de exemplos práticos.
Sumário
- Composição em Java
- Agregação em Java
- Composição vs. Agregação
- Trabalhando com Composição em Java
- Trabalhando com Agregação em Java
Composição em Java
Composição, uma relação “tem-um” forte, significa uma relação todo-parte em que o ciclo de vida da parte depende totalmente do todo. A destruição do todo também destrói suas partes; as partes não podem existir independentemente. Considere um carro: ele é composto por um motor, rodas, portas, etc. Descartar o carro descarta esses componentes.
Em Java, a composição é tipicamente implementada instanciando diretamente objetos parte dentro da classe do objeto todo. O objeto todo cria e gerencia essas partes.
Agregação em Java
Agregação, uma relação “tem-um” mais fraca, indica que a parte pode existir independentemente do todo. O objeto todo contém referências às partes, mas seus ciclos de vida não estão diretamente vinculados. Por exemplo, uma universidade “tem-um” departamento, mas o departamento persiste mesmo que a universidade feche.
Em Java, a agregação envolve o objeto todo mantendo referências a objetos parte. Essas referências podem ser gerenciadas separadamente. As partes podem ser criadas antes ou depois do objeto todo e sobreviver à sua destruição.
Composição vs. Agregação
A tabela abaixo resume as principais diferenças:
Característica | Composição | Agregação |
---|---|---|
Relacionamento | “Tem-um” forte (todo-parte) | “Tem-um” fraco |
Ciclo de Vida | O ciclo de vida da parte depende do todo | O ciclo de vida da parte é independente do todo |
Propriedade | O objeto todo possui e gerencia as partes | O objeto todo contém referências às partes |
Existência da Parte | A parte não pode existir independentemente | A parte pode existir independentemente |
Implementação | Instanciação direta dentro do objeto todo | Referências a objetos parte independentes |
Trabalhando com Composição em Java
Vamos ilustrar a composição com um Car
composto por um 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();
}
}
O objeto Engine
é criado dentro da classe Car
. A existência do Engine
depende do Car
.
Trabalhando com Agregação em Java
Agora, vamos ilustrar a agregação com uma universidade e seus departamentos:
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();
}
}
A University
mantém referências a objetos Department
. Os objetos Department
existem independentemente e podem ser usados em outros lugares.
A compreensão da composição e da agregação permite o design de aplicações Java mais robustas, fáceis de manter e bem estruturadas. A escolha depende dos requisitos de design e do gerenciamento do ciclo de vida desejado dos objetos.