Een switch is een optimalisatie van de if als je meerdere ifs onder elkaar hebt. De implementatie van de switch zorgt ervoor dat dit (tot nu toe) alleen werkt met integers.
Om de werking enigszins te kunnen begijpen, moet je weten hoe een table-lookup werkt. Die werkt zo:
Java:
1
2
3
4
5
| static String[] cijfer = {"nul", "een", "twee"};
static String getCijfer(int i) {
return cijfer[i];
} |
De i wordt gebruikt als index in de tabel. i moet dus een integer zijn of iets dat er op lijkt.
In een andere situatie kan het misschien zo zijn dat je een waarde zoals i moet transformeren naar een index. Ook kan het voorkomen dat een aantal elementen in de tabel leeg zijn.
De switch wordt ook zoiets in assembly. Het verschil tussen de normale table lookup en de switch is dat er met de switch code geselecteerd kan worden. Neem bijvoorbeeld:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
| static int bereken(int op, int a, int b) {
// op: 0 = optellen, 1 = aftrekken, 2 = keer, 3 = delen
int z = 0;
switch(op) {
case 0: z = a + b; break;
case 1: z = a - b; break;
case 2: z = a * b; break;
case 3: z = a / b;
}
return z;
} |
Een compiler maakt hier meestal zoiets van:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| static adres[] tabel = {adres van lbl0, adres van lbl1, adres van lbl2, adres van lbl3};
static int bereken(int op, int a, int b) {
int z = 0;
goto tabel[op];
lbl0:
z = a + b; goto end;
lbl1:
z = a - b; goto end;
lbl2:
z = a * b; goto end;
lbl3:
z = a / b;
end:
return z;
} |
Een tabel bekijken gaat natuurlijk veel sneller dan een grote rij ifs aflopen.
In dit topic gaat het de hele tijd over de switch, maar de topicsstarter heeft helemaal geen switch nodig. De code blijft steeds hetzelfde. Alleen de data verandert. Een lookup-table is dus voldoende.
De normale lookup-table werkt (net als de switch) alleen met integers. Om dit werkend te krijgen kan je een integer-veld toevoegen aan je klassen/objecten die je kan gebruiken om de index te berekenen. Wat je ook kan doen is de java.util.HashMap gebruiken.
Voor 3 dingen gaat een rijtje ifs snel genoeg. Ik zou dat niet veranderen.
Zowiezo heb je de switch niet nodig in een goed OO programma. Neem bijvoorbeeld de bereken(int op, int a, int b) van hierboven. In de OO-versie heb je een abstracte klasse Expressie met een abstracte bereken(). Hiervan bestaan subklassen Constante, Optellen, Aftrekken, Keer en Delen. a en b zijn velden in die klassen en zijn van het type Expressie. De bereken() in Optellen ziet er bijvoorbeeld zo uit:
Java:
1
2
3
| int bereken() {
return a.bereken() + b.bereken();
} |