Ik had vandaag ergens last van bij een parse tree verwerken (visitor pattern van JTB) in Java. Minimale* testcase:
Verwachtte output:
Gekregen output:
Er is uiteraard een workaround voor:
Daar wordt de code nu niet bepaald leesbaarder van.
Hoe komt dit? En wat moet ik doen om een eindeloze if/elseif reeks overbodig te maken? Met 20 cases is dat niet echt leuk meer
*) Ja, met 2 klasses had het ook gekund
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| //Hond.java public class Hond { public String toString() { return "Hond"; } } //Tekkel.java public class Tekkel extends Hond { public String toString() { return "Tekkel"; } } //JackRussel.java public class JackRussel extends Hond { public String toString() { return "JackRussel"; } } //Printer.java import java.util.Vector; public class Printer { public static void main(String[] args) { Vector<Hond> v = new Vector<Hond>(); v.add(new Tekkel()); v.add(new JackRussel()); v.add(new Hond()); Printer p = new Printer(); for (Hond h: v) { p.print(h); } } public void print(Hond h) { System.out.println("Hond is " + h.toString()); } public void print(Tekkel t) { System.out.println("Tekkel is " + t.toString()); } public void print(JackRussel j) { System.out.println("Jack Russel is " + j.toString()); } } |
Verwachtte output:
code:
1
2
3
| Tekkel is Tekkel Jack Russel is JackRussel Hond is Hond |
Gekregen output:
code:
1
2
3
| Hond is Tekkel Hond is JackRussel Hond is Hond |
Er is uiteraard een workaround voor:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
| public static void main(String[] args) { //[knip] for (Hond h: v) { if (h instanceof Tekkel) { p.print( (Tekkel) h); } else if (h instanceof JackRussel) { p.print( (JackRussel) h); } else p.print(h); } } |
Daar wordt de code nu niet bepaald leesbaarder van.
Hoe komt dit? En wat moet ik doen om een eindeloze if/elseif reeks overbodig te maken? Met 20 cases is dat niet echt leuk meer

*) Ja, met 2 klasses had het ook gekund