La coerenza dell'associazione si garantisce imponendo che le due istruzioni di cambiamento vengano sempre eseguite insieme.
autobus.setRimessa(rimessa); rimessa.aggiungiAutobus(autobus);
Il vincolo viene garantito con public e private.
Nel dettaglio:
public class Autobus {
…
public void setRimessa(Autorimessa rimessa) {
this.rimessa = rimessa;
}
…
}
|
public class Autobus {
…
public void setRimessa(Autorimessa rimessa, Gettone gettone) {
if (gettone == null)
return;
this.rimessa = rimessa;
}
…
}
|
il metodo si può ancora chiamare da qualsiasi altro punto del codice passando null come Gettone, ma non ha effetti; volendo, si può anche generare una eccezione in questo caso
lo stesso per il metodo addAutobus() di Autorimessa
public class Gettone {
private Gettone() {
}
…
}
gli oggetti vengono sempre e soltanto creati da new Gettone(), e questo metodo si può invocare solo nella classe Gettone dato che è privato
dato che i metodi non statici richiedono un oggetto di invocazione, gli unici metodi che si possono invocare dall'esterno senza un oggetto Gettone sono statici
public class Gettone {
private Gettone() {
}
public static void aggiungi(Autobus autobus, Autorimessa rimessa) {
Gettone gettone = new Gettone();
autobus.setRimessa(rimessa, gettone);
rimessa.addAutobus(autobus, gettone);
}
…
}
il metodo non richiede l'oggetto di invocazione perchè è statico; lo crea perchè si trova nella classe e quindi può anche invocare i metodi privati della classe
… Gettone.aggiungi(autobus, autorimessa); …
lo stesso viene fatto per la cancellazione
Sequenza di operazioni: