Versions Compared

Key

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

...

Code Block
languagejava
public interface ListListener {
    public void listChanged(ObservableList list, int pos);
}

ListListener-grensesnittet må implementers av alle klasser som ønsker å fungere som lyttere for HighscoreList-instanser. Disse registrere seg med HighscoreList sin addListListener-metode og vil siden få beskjed ved at listChanged-metoden kalles hver gang et nytt resultat kommer inn på lista. Argumentene som tas inn er HighscoreList-objektet som ble endret og posisjonen i lista der endringen skjedde.

Merk at første argument til listChanged-metoden er av typen ObservableList. Dette er en abstrakt superklasse for HighscoreList kalt ObservableList, som innføres i del 3 og som da skal holde orden på lista. ObservableList vil ha en del generelle metoder som HighscoreList arver og kan bruke. For å kunne kjøre testene for HighscoreList allerede i del 1, så må ObservableList være definert fra starten. Lag derfor en tom ObservableList-klasse og bruk denne som superklasse for HighscoreList.

...

 

Del 1: Implementasjon av HighscoreList

PlantUML Macro
class ObservableList {
}

class HighscoreList {
	int maxSize
	Collection<Integer> results
	HighscoreList(int)
	int size()
	int getElement(int)
	void addResult(int)
	addListListener(ListListener)
	removeListListener(ListListener)
}

ObservableList <|-- HighscoreList

interface ListListener {
	listChanged(ObservableList, int)
}
ObservableList -right-> "*": listListeners

En HighscoreList skal holde styr på heltallsresultater (av typen int/Integer). Lista skal være observerbar ved at den kan registrere lyttere (ListListener-instanser) og si fra til dem når lista blir endret. Lista skal ha en maksimal lengde, som settes i konstruktøren, f.eks. skal en topp 10-liste kunne opprettes med new HighscoreList(10). Nye resultater registreres med metoden addResult(int), som skal finne riktig posisjon og legge resultatet inn (dersom det er godt nok). Dersom lista er for lang, så skal det dårligste resultatet fjernes.

Merk at første argument til listChanged-metoden er av typen ObservableList. Dette er en abstrakt superklasse for HighscoreList kalt ObservableList, som innføres i del 3 og som da skal holde orden på lista. ObservableList vil ha en del generelle metoder som HighscoreList arver og kan bruke. For å kunne kjøre testene for HighscoreList allerede i del 1, så må ObservableList være definert fra starten. Lag derfor en tom ObservableList-klasse og bruk denne som superklasse for HighscoreList.

Klassediagrammet for HighscoreList, ListListener og ObservableList er vist til venstre. Her er en oversikt over metoden som må implementeres:

  • HighscoreList(int maxSize) - konstruktøren tar inn maks antall resultater som lista skal kunne holde. Denne verdien må brukes av addResult, slik at resultater som er for dårlige kastes.
  • size() - returnerer antall elementer i lista, som altså aldri skal overstige maks-antallet
  • int getElement(int) - returnerer resultatet i posisjonen angitt av argumentet
  • void addResult(int) - registrere et nytt resultat, og dersom resultatet er godt nok til å komme med på lista, så legges det inn på riktig plass. Dersom lista blir for lang, så må dårligste resultat kastes. Alle registrerte lyttere må få beskjed om en evt. endring av lista, inkludert på hvilken posisjon som ble endret.
  • addListListener(ListListener) - registrerer en ny lytter
  • removeListListener(ListListener) - fjerner en tidligere registrert lytter

 

 HighscoreListen blir observert av ListListeners. Disse objektene skal gis beskjed om endringer i listen og hvilke elementer som er endret. Dette gjøres i metoden fireListChanged(int, int), som forteller alle ListListeners hvilke elementer som har blitt endret (f.eks. fra og med element 3 til og med element 10). HighscoreList må også ha metodene addListListener(ListListener) og removeListListener(ListListener), som henholdsvis legger til og fjerner observerende ListListeners.

 

JExercise-testkode for denne oppgaven finner du her: inheritance/HighscoreListTest.java (legg til inheritance/TestListener.java i samme package som HighscoreList. Husk å legge inn ListListener-grensesnittet under før du kjører testen). Original-koden (jextest) finner du her: inheritance/HighscoreList.jextest.

...