Oggetti gettone

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:

i due metodi di modifica richiedono anche un oggetto Gettone
si aggiunge l'oggetto come un parametro che non deve essere null
public class Autobus {
	…

	public void setRimessa(Autorimessa rimessa) {
		this.rimessa = rimessa;
	}

	…
}
[bigarrow.fig]
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

gli oggetti Gettone si possono creare solo nella classe Gettone
il costruttore è privato
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

l'unico punto della classe Gettone dove viene creato un oggetto Gettone esegue sempre entrambe le modifiche
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:

[gettone.fig]