mark13 ha scritto:
Infine vedendo l'esercizio il professore ha detto che tra le due classi è presente una relazione di aggregazione. Ma a me sembra che la relazione tra le due classi sia quella di composizione
La differenza tra "composizione" e "aggregazione" è molto fine: nella composizione, l'oggetto B (contenuto in A) non può esistere (o per dirlo diversamente, non ha senso che esista) indipendentemente dal contenitore A. Lo si può dire anche in altro modo: il ciclo di vita di B dipende da quello del contenitore A. Se il contenitore viene distrutto, anche gli oggetti contenuti devono essere distrutti.
Nella aggregazione non è così, ovvero l'oggetto contenuto può anche esistere (cioè avere senso) indipendentemente dal contenitore in cui è contenuto.
Questa differenza è molto fine e non sempre è importante saperla vedere o impostare. Ti serve se ad esempio devi disegnare il diagrammino UML, dove c'è la simbologia apposita per distinguere tra aggregazione e composizione.
Ma se sviluppi in Java è invece più importante avere ben chiari i concetti sulle relazioni "is-a" (ereditarietà) e "has-a" (associazione). Poi che la associazione sia di "composizione" piuttosto che di "aggregazione", bisogna analizzare appunto il contesto e capire bene chi ha il controllo degli oggetti, dove vengono creati e se ha senso usarli indipendentemente tra di loro.
mark13 ha scritto:
con iniezione di dipendenza esercitata dal metodo aggiundiVoce():
Se intendi dipendenza nel senso di
dependency injection (come si usa nei framework dove viene applicata la DI, es. Spring) allora un oggetto B è una "dipendenza" di A se A
ha tassativamente bisogno di B per compiere il suo lavoro.
Caso banale: uno UserService che ha bisogno di un EmailService per inviare una email quando ad esempio l'utente deve cambiare la password. Questa è una dipendenza, lo UserService
deve ricevere un oggetto EmailService per poter fare il suo lavoro. Indipendentemente dal fatto se ci troviamo in un ambiente dove c'è la gestione della DI o no, lo si può codificare così:
public class UserService {
private final EmailService emailService;
public UserService(EmailService emailService) {
this.emailService = emailService;
}
.....
}
Nel tuo caso, quasi sicuramente Rubrica fa solo da contenitore per N oggetti Voce e poi li espone banalmente con quel get(). Rubrica quindi non dipende dagli oggetti Voce per il suo funzionamento. Può funzionare con 0, 1, 10, 1000 oggetti Voce.