Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

PlantUML Macro
object "r21 : Rolle2Klasse" as r21 {
}
object "r1 : Rolle1Klasse" as r1 {
}
object "r22 : Rolle2Klasse" as r22 {
}

r1 -left-> "rolle2" r21
r1 -right-> "rolle2" r22
r21 --> "rolle1" r1
r22 --> "rolle1" r1


Code Block
languagejava
Rolle1Klasse r1 = new Rolle1Klasse();
Rolle2Klasse r21 = new Rolle2Klasse(), r22 = new Rolle2Klasse();
// koblinger den ene veien
r1.addRolle2(r21);
r1.addRolle2(r22);
// og den andre veien
r21.setRolle1(r1);
r22.setRolle1(r1);

Med koden i klassene over, så må en altså selv sørge for konsistens, dvs. at hvis r1 er koblet til r2 r21 og r22 gjennom rolle2, så er r2 r21 og r22 koblet til r1 gjennom rolle1. Det er bedre om dette skjer automatisk, så en er sikret konsistens. Merk at dette bare gjelder når assosiasjonen er to-veis, noe den ikke alltid er.

Det skal altså være nok å kalle én add- eller set-metode metoden for å sette opp begge koblingene (evt. koble begge av med null som argument). Hver add- og set-metode metoden må derfor sjekke koblingen den andre veien, også. Dette kan være litt fiklete å gjøre rett, så her er koden for det to add- og set-metodenemetoden:

Code Block
// i Rolle1Klasse

public void setRolle2addRolle2(Rolle2Klasse rolle2) {
	// sjekk om koblingen er riktig allerede
	if (this.rolle2 == rolle2roller2.contains(rolle2)) {
		return;
	}
	this.roller2.add(rolle2);
	// huskopprett denkoblingen gamletilbake, og sett den nyeom nødvendig
	Rolle2Klasse oldRolle2 if (rolle2.getRolle1() != this.rolle2) {
		rolle2.setRolle1(this);
	this.rolle2 = oldRolle2;}
}

public void removeRolle2(Rolle2Klasse rolle2) {
	// hvissjekk detom varkoblingen ener kobling fra før, koble den andre frariktig allerede
	if (oldRolle2 != null this.roller2.contains(rolle2)) {
		return;
	}
	oldRolle2this.roller2.setRolle1remove(nullrolle2);
	}
	// hvisfjern dette er en ny koblingkoblingen tilbake, koble den andre tilom nødvendig
	if (thisrolle2.rolle2getRolle1() !== nullthis) {
		this.rolle2.setRolle1(thisnull);
	}
}
Code Block
// i Rolle2Klasse

public void setRolle1(Rolle1Klasse rolle1) {
	// sjekk om koblingen er riktig allerede
	if (this.rolle1 == rolle1) {
		return;
	}
	// huskfjern den gamle ogkoblingen, settom den nyenødvendig
	Rolle1Klasse oldRolle1 = this.rolle1;
	this.rolle1 = oldRolle1;
	// hvis det var en kobling fra før, koble den andre fra
	if (oldRolle1 if (this.rolle1 != null) {
		oldRolle1this.rolle1.setRolle2removeRolle2(nullthis);
	}
	this.rolle1 = rolle1;
	// hvisopprett detteden er en ny koblingnye koblingen, koble den andre tilom nødvendig
	if (this.rolle1 != null) {
		this.rolle1.setRolle2addRolle2(this);
	}
}

De to set-metodene samarbeider på en måte om å gjøre tilstanden konsistent. Vi ser at koden er de to metodene er like, bortsett fra at rollene er byttet om. Merk at innkapslingen er ivaretatt ved at begge bruker den andres set-metode.

...