Un enum
modella un insieme di finite di diverse scelte in cui devi sapere con chi hai a che fare prima di poter procedere. La spedizione dinamica risolve un problema completamente diverso, consentendo un numero illimitato di opzioni e gestendole in modo uniforme.
Un enum
è probabilmente più efficiente e generalmente più sicuro dell'ispezione della classe del nodo:
if (node instanceof Type1Node) {
...
} else if (node instanceof Type2Node) {
...
} else {
throw new AssertionError("Someone added a new node type.");
}
VS
switch (node.type) {
case Tree.Kind.AND:
...
case Tree.Kind.AND_ASSIGNMENT:
...
}
throw new AssertionError("Someone modified this enum");
La versione enum
ha un solo salto e riceverai avvertimenti se ti perdi qualche caso, per negligenza o perché l'enum è stato aggiornato. Non puoi ottenere questi avvisi con una tonnellata di test instanceof
perché è possibile aggiungere nuove sottoclassi.
Un'alternativa ragionevole è usare una qualche forma di Visitor
. Ma anche con lambda che consente una sintassi più compatta per i visitatori, ci sono ancora dei vantaggi in switch
: puoi facilmente unire più casi ogni volta che vengono gestiti allo stesso modo.