Sobes.tech
Junior

Cosa sai sulla composizione delle classi in programmazione?

sobes.tech AI

Risposta dell'AI

La composizione è una relazione di "contiene" o "parte di", in cui una classe (composito) contiene un riferimento a un'altra classe (componente) o alle sue istanze. Il ciclo di vita del componente è generalmente strettamente legato a quello del composito. È una relazione forte in cui il componente non può esistere senza il composito.

Vantaggi della composizione:

  • Flessibilità: È più facile modificare il comportamento cambiando i componenti.
  • Riduzione del coupling: Le classi dipendono meno tra loro rispetto all'ereditarietà.
  • Riutilizzo: Gli stessi componenti possono essere usati in diversi compositi.

Esempio: La classe Auto può contenere un riferimento alla classe Motore. Se l'Auto viene distrutta, anche il Motore (in questo contesto) cessa di esistere.

class Motore {
    // proprietà e metodi del motore
}

class Auto {
    private Motore motore; // composizione

    public Auto() {
        this.motore = new Motore(); // creazione del componente all'interno del composito
    }

    // altre proprietà e metodi dell'auto
}

Differenza con l'aggregazione: Nell'aggregazione, i componenti possono esistere indipendentemente dal composito (relazione debole). Esempio: La classe Università contiene riferimenti a istanze della classe Studente. Gli studenti possono esistere anche fuori dall'università.

Nello sviluppo Android, la composizione è ampiamente usata, ad esempio, nella creazione di viste (ViewGroup contiene View), nel lavoro con le dipendenze tramite Dagger/Hilt. È un approccio preferito rispetto all'ereditarietà multipla (che non esiste in Java/Kotlin per le classi) ed è spesso più flessibile rispetto all'ereditarietà semplice.

class UserRepository(private val apiService: ApiService) {
    // UserRepository "utilizza" ApiService (composizione/aggregazione)
    fun fetchUser(userId: String) {
        // apiService.getUser(userId)
    }
}