Voorbeelden
Voorbeeld: Klok display
Dit voorbeeld is geïnspireerd op het voorbeeld in hoofdstuk 3 (§3.1 t/m §3.11) van het boek "Objects First with Java".
Hieronder zie je een plaatje van een digitale klok. We kunnen deze klok opdelen in twee displays: één voor uren en één voor minuten.
De klok kan de tijd met één minuut ophogen. Als de minuten daardoor op 60 zouden komen te staan moet het aantal uren met 1 worden opgehoogd en de minuten op 0 worden gezet. Als de uren daardoor op 24 zouden komen te staan, moet de klok op 0:00 worden gezet.
Hieronder zie je een mogelijk klassendiagram van het domein.
De klasse NummerDisplay heeft twee attributen en drie methoden (de constructor is niet aangegeven). Voor elke attribuutnaam of methodenaam staat een + of een -; + betekent public en - private.
Elk KlokDisplay-object maakt gebruik van twee NummerDisplay-objecten: de ene voor het weergeven van de uren en de andere voor de minuten. Elk KlokDisplay-object is dus gerelateerd met twee NummerDisplay-objecten. Deze relaties, in UML spreekt men van associaties, geven we in het klassendiagram weer door een lijn te tekenen van KlokDisplay naar NummerDisplay.
We bekijken drie facetten van dit klassendiagram:
-
rollen en rolnamen
Het uiteinde van een associatie wordt dan ook wel een rol genoemd. De rol dieNummerDisplayin de ene associatie speelt wordturengenoemd. De rol dieNummerDisplayin de andere associatie speelt noemen weminuten. In code corresponderen deze rollen met attributen van de klasseKlokDisplay. -
multipliciteiten
De multipliciteiten geven aan hoeveel instanties van de ene klasse gerelateerd zijn aan een instantie van de andere klasse. EenKlokDisplayheeft dus 1NummerDisplayvoor de uren en 1NummerDisplayvoor de minuten. Dit wordt in het diagram aangegeven met het getal 1 bij de associaties. Andersom kun hoort een specifieke NummerDisplay bij één KlokDisplay. -
navigatie
Bij beide associaties wijst een pijl richting de klasseNummerDisplay. De associatie contains hours loopt vanKlokDisplaynaarNummerDisplay. Dit heet navigatie en betekent voor deze situatie dat een instantie vanKlokDisplayde bijbehorende instantie vanNummerDisplay(uren) kent en 'm een opdracht kan geven door een methode aan te roepen. Omgekeerd kent een instantie vanNummerDisplayniet deKlokDisplay-instantie waar hij bij hoort (daarom is er ook geen rol aangegeven).
De java-code van de klasse KlokDisplay, die correspondeert met het bovenstaande klassendiagram, ziet er als volgt uit:
public class KlokDisplay {
private NummerDisplay uren;
private NummerDisplay minuten;
private String display;
public KlokDisplay() {
...
}
public void tikTijd() {
...
}
public void updateDisplay() {
...
}
public String getDisplay() {
...
}
}
public class NummerDisplay {
private int waarde;
private final int limiet;
public NummerDisplay(int limiet) {
...
}
public void increment() {
...
}
public int getWaarde() {
...
}
public String getDisplay() {
...
}
}
Je ziet in de Java-code dat de klasse KlokDisplay twee attributen heeft van het type NummerDisplay: uren en minuten. Het attribuut uren correspondeert met de gelijknamige navigeerbare rol (d.w.z. de rol aan de pijlkant) van de associatie contains hours. Net zo correspondeert het attribuut minutes met de rol minuten van de associatie contains minuten.
Voorbeeld SB
In het onderstaande klassendiagram zie je een associatie tussen de klassen Docent en Student. De multipliciteiten bij deze associatie geven aan dat een docent SB'er is van nul of meer studenten en dat een student precies één docent als SB-docent heeft. De access modifiers zijn weggelaten.
Hieronder zie je een mogelijke implementatie in Java-code. De (0..*)-relatie wordt geimplementeerd door een List-type (bijvoorbeeld een ArrayList).
public class Docent {
private String code;
private List<Student> slbStudenten;
}
public class Student {
private int nummer;
private Docent slbDocent;
}
Je kunt een (0..*)-relatie op elke geschikte manier implementeren. Hieronder zie je een voorbeeld waarbij een Set gebruikt wordt in plaats van een List. Met dit datatype garandeer je dat een Docent niet twee keer dezelfde Student als SLB'er kan hebben (wat best toepasselijk is in dit voorbeeld).
public class Docent {
private String code;
private Set<Student> slbStudenten;
}
Voorbeeld Projectinzet
Een bedrijf heeft werknemers die worden ingezet bij projecten die worden uitgevoerd. Een van de werknemers speelt de rol van projectleider. Dit is in het onderstaande klassendiagram weergegeven.
Hieronder is een mogelijk Java-implementatie van de klassen Werknemer en Project. De klasse Werknemer heeft geen attribuut van het type Project omdat de navigatie-pijl in het klassendiagram naar Werknemer wijst.
public class Project {
private Set<Werknemer> medewerkers;
private Werknemer projectLeider;
}
public class Werknemer {
}