Versions Compared

Key

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

...

PlantUML Macro
class Memory {
	-List<?> possibleItems
	-List<?> expectedItems
	-int acceptedCount
	+Memory(Collection<?>)
	+int getItemCount()
	+int getAcceptedCount()
	+? nextItem()
	+Boolean acceptItem(?)
}

Hva skal ? erstattes med?

Vi ser at Memory-klassen nå inneholder en liste over alle mulige verdier kalt possibleItems, som elementene i expectedItems skal plukkes fra. Vi har også lagt til en konstruktør som krever at en oppgir samlingen av mulig verdier, når Memory-objekter opprettes.

Et viktig spørsmål er valg av typer for attributtene. Den generelle regelen er å bruke så generelle typer som mulig og velge grensesnitt-klasser fremfor implementasjoner, for å gi størst frihet ved kodingen. Derfor har vi valgt å bruke List fremfor Collection for både possibleItems og expectedItems. List utvider Collection med metoder for å hente ut elementer basert på posisjon, og dette er nyttig når vi skal velge ut tilfeldige elementer fra possibleItems i nextItem() og sammenligne et nytt element fra brukeren med siste element i expectedItems i acceptItem(...). Argumentet til Memory-konstruktøren er imidlertid av typen Collection, fordi vi kun trenger å gå sekvensielt gjennom det, når vi kopierer elementene inn i den interne lista.

...

Et alternativ er å gjøre Memory generisk ved å introdusere et typeparameter T og bruke typeparameteret i attributt-deklarasjonene, som vist under. Dette vil la oss spille med alle typer objekter, men hvert enkelt hukommelsesspill kan bare spilles med en bestemt type, som bestemmes (statisk) når Memory-objektet opprettes. En spesialisering med f.eks. String vil ha effekten at listene og argumentene blir spesialisert til String (der vi har brukt T), tilsvarende klassen under til høyre. Hvis vi da prøver å blande ulike typer, så vil det gi typefeil (i editoren og ved kjøring):

...