Sobes.tech
Junior

O que sabes sobre composição de classes em programação?

sobes.tech IA

Resposta da IA

A composição é uma relação de "contém" ou "parte de", na qual uma classe (composite) contém uma referência a outra classe (componente) ou às suas instâncias. O ciclo de vida do componente geralmente está estreitamente ligado ao ciclo de vida do composite. É uma relação forte onde o componente não pode existir sem o composite.

Vantagens da composição:

  • Flexibilidade: É mais fácil alterar o comportamento mudando os componentes.
  • Redução do acoplamento: As classes dependem menos umas das outras em comparação com a herança.
  • Reutilização: Os mesmos componentes podem ser usados em diferentes composites.

Exemplo: A classe Automóvel pode conter uma referência à classe Motor. Se o Automóvel for destruído, o Motor (neste contexto) deixa de existir.

class Motor {
    // propriedades e métodos do motor
}

class Automovel {
    private Motor motor; // composição

    public Automovel() {
        this.motor = new Motor(); // criação do componente dentro do composite
    }

    // outras propriedades e métodos do automóvel
}

Diferença para agregação: Na agregação, os componentes podem existir independentemente do composite (relação fraca). Exemplo: A classe Universidade contém referências a instâncias da classe Estudante. Os estudantes podem existir fora da universidade.

No desenvolvimento Android, a composição é amplamente utilizada, por exemplo, ao criar visualizações (ViewGroup contém View), ao trabalhar com dependências via Dagger/Hilt. É uma abordagem preferencial em comparação com herança múltipla (que não existe em Java/Kotlin para classes) e muitas vezes mais flexível do que herança simples.

class UserRepository(private val apiService: ApiService) {
    // UserRepository "utiliza" ApiService (composição/agrupamento)
    fun fetchUser(userId: String) {
        // apiService.getUser(userId)
    }
}