Associação, Agregação e Composição em Java

Na Programação Orientada a Objetos, os conceitos de associação, agregação e composição descrevem diferentes formas de relacionamento entre objetos e ajudam a modelar a estrutura e a hierarquia dos dados. Cada um desses conceitos reflete um tipo específico de relacionamento e tem implicações diferentes na criação e gestão de objetos em Java.

Associação

A associação é o relacionamento mais geral entre duas classes. Ela representa uma relação onde um objeto de uma classe usa ou interage com objetos de outra classe. A associação pode ser unidirecional ou bidirecional.

  • Unidirecional: Uma classe conhece e utiliza a outra, mas a segunda classe não tem conhecimento da primeira.
  • Bidirecional: Ambas as classes conhecem e utilizam uma à outra.

Exemplo de Associação:

public class Motor {
void ligar() {
System.out.println("Motor ligado.");
}
}

public class Carro {
Motor motor; // Associação unidirecional

Carro(Motor motor) {
this.motor = motor;
}

void ligarCarro() {
motor.ligar();
System.out.println("Carro ligado.");
}
}

No exemplo acima, a classe Carro tem uma referência ao objeto Motor, demonstrando uma associação unidirecional onde Carro usa Motor.

Agregação

A agregação é um tipo especial de associação que representa uma relação “tem um” onde o objeto contido pode existir independentemente do objeto que o contém. A agregação implica que o objeto agregado pode existir fora do contexto do objeto principal e não depende de sua vida útil.

Exemplo de Agregação:

public class Departamento {
String nome;
// Relacionamento de agregação com a classe Funcionario
List<Funcionario> funcionarios;

Departamento(String nome) {
this.nome = nome;
funcionarios = new ArrayList<>();
}

void adicionarFuncionario(Funcionario funcionario) {
funcionarios.add(funcionario);
}
}

public class Funcionario {
String nome;

Funcionario(String nome) {
this.nome = nome;
}
}

Neste exemplo, um Departamento pode ter vários Funcionarios, mas os Funcionarios podem existir independentemente do Departamento. A agregação é representada pela relação entre Departamento e Funcionario, onde o Funcionario pode fazer parte de diferentes Departamentos.

Composição

A composição é uma forma mais forte de agregação onde o objeto contido não pode existir sem o objeto que o contém. A composição indica uma relação de “parte de”, onde o ciclo de vida do objeto contido é gerenciado pelo objeto que o contém.

Exemplo de Composição:

public class Carro {
// Composição com a classe Motor
private Motor motor;

Carro() {
motor = new Motor(); // Motor é criado juntamente com o Carro
}

void ligarCarro() {
motor.ligar();
System.out.println("Carro ligado.");
}
}

class Motor {
void ligar() {
System.out.println("Motor ligado.");
}
}

Aqui, a classe Carro cria e possui um Motor internamente. O Motor não pode existir sem o Carro, refletindo uma relação de composição onde o ciclo de vida do Motor está vinculado ao ciclo de vida do Carro.

Resumo

  • Associação: Relacionamento geral entre classes; pode ser unidirecional ou bidirecional.
  • Agregação: Relação “tem um” onde o objeto contido pode existir independentemente do objeto que o contém.
  • Composição: Relação “parte de” onde o objeto contido não pode existir sem o objeto que o contém e o ciclo de vida é gerenciado pelo objeto principal.

Compreender esses conceitos ajuda a modelar de forma eficaz as interações e a estrutura entre classes em projetos Java, promovendo um design mais claro e eficiente.