Versions Compared

Key

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

...

1-1-assosiasjoner er koblinger mellom objekter hvor ett objekt av en type bare kan ha én navngitt kobling til ett annet objekt av en annen eller samme type. Et eksempel er eksempel at en person kan ha kjæledyr, men bare kan være gift med én person (om gangen), så et Person-objekt kan bare ha én ekteskap-kobling til et annet Person-objekt. I dette tilfellet må det andre Person-objektet ha den samme koblingen tilbake. Merk at det samme Person-objektet kan godt ha andre koblinger til samme eller andre Person-objekter, men koblingen må hete noe annetett, og kjæledyret kan bare ha én eier. Person-klassen vil ha getPet- og setPet-metoder, mens Pet-klassen vil ha getOwner- og setOwner. Så kommer det viktige poenget: Hvis en person er koblet til kjæledyret, så må kjæledyret være koblet tilbake. Det betyr at hvis en kaller person.setPet(pet), så må den også implisitt kalle pet.setOwner(person) og omvendt, så både eier og kjæredyr kobles til den andre. Og da blir det lett komplisert kode... Heldigvis finnes det en generell løsning som vises under.

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

...

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.

Her er koden en får hvis den generelle løsningen brukes på person og kjæredyr-eksemplet:

Code Block
// i Person

private Pet pet;
 
public Pet getPet() {
    return pet;
}
public void setPet(Pet pet) {
	// sjekk om koblingen er riktig allerede
	if (this.pet == pet) {
		return;
	}
	// husk den gamle og sett den nye
	Pet oldPet = this.pet;
	this.pet = pet;
	// hvis det var en kobling fra før, koble den andre fra
	if (oldPet != null && oldPet.getOwner() == this) {
		oldPet.setOwner(null);
	}
	// hvis dette er en ny kobling, koble den andre til
	if (this.pet != null) {
		this.pet.setOwner(this);
	}
}
Code Block
// i Pet

private Person owner;
 
public Person getOwner() {
    return owner;
}
public void setOwner(Person owner) {
	// sjekk om koblingen er riktig allerede
	if (this.owner == owner) {
		return;
	}
	// husk den gamle og sett den nye
	Person oldOwner = this.owner;
	this.owner = owner;
	// hvis det var en kobling fra før, koble den andre fra
	if (oldOwner != null && oldOwner.getPet() == this) {
		oldOwner.setPet(null);
	}
	// hvis dette er en ny kobling, koble den andre til
	if (this.owner != null) {
		this.owner.setPet(this);
	}
}