Versions Compared

Key

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

...

En viktig del av det å implementere assosiasjoner er å sikre konsistens, dvs. at objekter i hver ende av en kobling refererer korrekt til hverandre. Et eksempel på dette for 1-n-assosiasjoner er foreldreskap, hvor foreldre og barn er koblet til samme i et slektstre. I denne oppgaven skal en Person-klasse implementeres og de å legge til (og fjerne) barn håndteres korrekt, som illustrert nedenfor.

PartnerPerson-klassen skal inneholde informasjon om navn (en String) og kjønn (en char, 'F' eller 'M'), som bare skal kunne settes i konstruktøren, og mor, far og partneren barn, som er et annet Partner-objekt andre Person-objekter. Navnet er ikke viktig for oppførselen, men er grei å ha med i en toString()-metode, for å skille Partner Person-objektene fra hverandre. Partner Person-klassen skal ha følgende metoder for å lese tilstanden:

  • getName() - returnerer navnet knyttet til dette Partner Person-objektet
  • getGender() - returnerer tegnet som representerer kjønnet, enten 'F' eller 'M'
  • getMothergetPartner() - returnerer Partner Person-objektet som er knyttet til dette Partner-objektetmoren, evt. null
  • getFather() - returnerer Person-objektet som er faren, evt. null, hvis partnerskap ikke er inngått
  • getChildCount() - returnerer antall barn dette Person-objektet har
  • getChild(int n) - returnerer barn nr. n (altså et Person-objekt), evt. utløser (et passende) unntak om n er for stor (eller liten)

Person-klassen har to sett med endringsmetoder, knyttet til de to rollene i hver ende av children-mother/father-assosiasjonen.

Fra children-perspektivet har vi følgende to metoder:

  • addChlid(Person) - oppretter en kobling til et barn (et annet Person-objekt). Dersom Person-objektet som metoden kalles på, er en kvinne, så skal denne bli barnets mor, og motsatt, dersom Person-objektet som metoden kalles på, er en mann, så skal denne bli barnets far.
  • removeChild(Person) - fjerner en kobling til et barn (et annet Person-objekt). Dersom Person-objektet som metoden kalles på, er moren til argumentet, så skal mother-koblingen fjernes, og motsatt, dersom Person-objektet som metoden kalles på, er argumentets far, så skal father-koblingen fjernes.

Fra mother/father-perspektivet har vi følgende to metoder:

  • setMother(Person) - setter argumentet (en kvinne) som moren til Person-objektet som metoden kalles på. Argumentet får samtidig registrert Person-objektet som metoden kalles på, som sitt barn.
  • setFather(Person) - setter argumentet (en mann) som faren til Person-objektet som metoden kalles på. Argumentet får samtidig registrert Person-objektet som metoden kalles på, som sitt barn.

Det som er verd å merke seg er at begge sett med metoder, addChild/removeChild og setMother/setFather, må ha logikk som håndterer koblingen den andre veien, så addChild/removeChild må kalle setMother/setFather og omvendt, eller ha kode med tilsvarende effekt. Dette kan være nokså fiklete, fordi en både må sikre konsistens og unngå uendelig nøstede kall (inntil du får StackOverflowException).

Partner-klassen har kun én endringsmetode, setPartner(Partner), som brukes både for å inngå partnerskap, når argumentet er et Partner-objekt, og oppløse det, når argumentet er null. Figurene under illustrerer tilfellene som må kunne håndteres, og som testes av testene det er lenket til.

...