Con Enum, puoi avere un metodo per istanza.
public enum ActionEnum {
ABC {
@Override
void doSomething() {
System.out.println("Doing something for ABC");
}
},
XYZ {
@Override
void doSomething() {
System.out.println("Doing something for XYZ");
}
};
abstract void doSomething();
}
public class MyActionClass {
public void myMethod(String name) {
ActionEnum.valueOf("ABC").doSomething();
}
}
E 'ancora un pò disordinato (grande enum con 100 voci, anche tutto ciò che fa è dispacciamento), ma può evitare il codice di inizializzazione HashMap (100 + mette anche disordinato a mio parere).
E ancora un'altra opzione (a scopo di documentazione) sarebbe riflessione:
public interface Action {
void doSomething();
}
public class ABCAction implements Action {
@Override
public void doSomething() {
System.out.println("Doing something for ABC");
}
}
public class MyActionClass {
void doSomethingWithReflection(String name) {
try {
Class<? extends Action> actionClass = Class.
forName("actpck."+ name + "Action").asSubclass(Action.class);
Action a = actionClass.newInstance();
a.doSomething();
} catch (Exception e) {
// TODO Catch exceptions individually and do something useful.
e.printStackTrace();
}
}
}
Ogni approccio ha è di compromessi:
- HashMap = veloce + Kinda disordinato codice ("set-up" con centinaia di put)
- Enum = Fast + Kinda messy 2 (file enorme).
- Reflection = Più lento + errore di runtime incline, ma fornisce una separazione netta senza ricorrere a HashMap giganteschi.
fonte
2011-09-08 15:44:51
Lo schema dei comandi è il modo per gestire questo di sicuro, si veda: http://stackoverflow.com/questions/1199646/long-list-of-if-statements-in-java/1199677#1199677 –
Cosa c'è di sbagliato in questo modo così com'è, oltre a sembrare fastidioso? –