You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

Denne siden skisserer hvordan 1-n-assosiasjoner, også kalt én-til-mange-assosiasjoner, kan kodes.

1-n-assosiasjoner er koblinger mellom objekter hvor ett objekt av en type kan ha flere av en navngitt kobling til andre objekter av en annen eller samme type, men de andre kan bare ha én kobling tilbake. Et eksempel er at en CD kan ha flere spor, mens et spor bare kan være på/inni én CD. Et CD-objekt kan altså ha ingen, én eller flere inneholder-koblinger til Spor-objekter, mens et Spor-objekt kan bare være koblet (tilbake) til ett CD-objekt.

1-n-assosiasjoner kodes i Java med et Collection-felt spesialisert med < > til riktig type og med navn tilsvarende rollen. Navngivingen av feltet er forsåvidt underordnet, siden det er innkapslingen i form av get-, add og remove-metoder som er viktig. Her er diagrammet for en generell 1-n-assosiasjon og kode-malen for de to klassene som deltar i den:

Rolle1KlasseRolle2Klasseassosiasjonrolle1 0:1rolle2 0:n
public class Rolle1Klasse {

	private Collection<Rolle2Klasse rolle2;

	public Rolle2Klasse getRolle2() {
		return rolle2;
	}
	public void setRolle2(Rolle2Klasse rolle2) {
		this.rolle2 = rolle2;
	}
}
public class Rolle2Klasse {

	private Rolle1Klasse rolle1;

	public Rolle1Klasse getRolle1() {
		return rolle1;
	}
	public void setRolle1(Rolle1Klasse rolle1) {
		this.rolle1 = rolle1;
	}
}

For å sette opp en gjensidig kobling, så må en opprette ett objekt av hver type og kalle dere respektive set-metoder med det andre objektet som argument:

r1 : Rolle1Klasser2 : Rolle2Klasserolle2rolle1
Rolle1Klasse r1 = new Rolle1Klasse();
Rolle2Klasse r2 = new Rolle2Klasse();
r1.setRolle2(r2);
r2.setRolle1(r1);

Med koden i klassene over, så må en altså selv sørge for konsistens, dvs. at hvis r1 er koblet til r2 gjennom rolle2, så er r2 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 set-metode for å sette opp begge koblingene (evt. koble begge av med null som argument). Hver set-metode må derfor sjekke koblingen den andre veien, også. Dette kan være litt fiklete å gjøre rett, så her er koden for det to set-metodene:

// i Rolle1Klasse

public void setRolle2(Rolle2Klasse rolle2) {
	// sjekk om koblingen er riktig allerede
	if (this.rolle2 == rolle2) {
		return;
	}
	// husk den gamle og sett den nye
	Rolle2Klasse oldRolle2 = this.rolle2;
	this.rolle2 = oldRolle2;
	// hvis det var en kobling fra før, koble den andre fra
	if (oldRolle2 != null) {
		oldRolle2.setRolle1(null);
	}
	// hvis dette er en ny kobling, koble den andre til
	if (this.rolle2 != null) {
		this.rolle2.setRolle1(this);
	}
}
// i Rolle2Klasse

public void setRolle1(Rolle1Klasse rolle1) {
	// sjekk om koblingen er riktig allerede
	if (this.rolle1 == rolle1) {
		return;
	}
	// husk den gamle og sett den nye
	Rolle1Klasse oldRolle1 = this.rolle1;
	this.rolle1 = oldRolle1;
	// hvis det var en kobling fra før, koble den andre fra
	if (oldRolle1 != null) {
		oldRolle1.setRolle2(null);
	}
	// hvis dette er en ny kobling, koble den andre til
	if (this.rolle1 != null) {
		this.rolle1.setRolle2(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.

 

  • No labels