Re: Visitor pattern vs if-ladder
On Fri, 24 Apr 2009, Daniel Pitts wrote:
Philipp wrote:
I think about replacing an if-ladder (with instanceof calls) in my
code with a visitor pattern,
Maybe consider adding an enum type-token, and using an EnumMap<Vehical.Type,
CountAccumulator>
where:
public class CountAccumulator {
private int count;
public void increment() { ++count; }
public int get() { return count; }
}
I usually avoid enum for type-tokens, but this seems like an appropriate
place to apply them, since you are looking for a very specific set of
"types".
I suspect my discomfort with type tokens is the same as yours, and stems
from the incomplete static typing: there's nothing stopping Car.getType()
returning VehicleType.BIKE.
But is there any clever generic trickery we could do to fix that?
[goes off and has a play]
Well, you can't make enums generic, so no, apparently not. Hmm.
It also would reduce the size of your count method/visitor
dramatically:
Map<Vehical.Type, CountAccumulator> count(Collection<Vehical> vehicals){
Map<Vehical.Type, CountAccumulator> counts =
new EnumMap<Vehical.Type, CountAccumulator>(CarType.class);
for (Vehical.Type type: Vehical.Type.values()) {
counts.put(type, new CountAccumulator());
}
for (Vehical vehical: vehicals) {
counts.get(vehical.getType()).increment();
}
return counts;
}
Good call! I was thinking you'd still have to write a switch on the enum,
but the EnumMap makes things very compact, but still fast.
tom
--
.... the gripping first chapter, which literally grips you because it's
printed on a large clamp.