使用枚舉,你可以有一個每個實例的方法。
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();
}
}
它仍然是有點亂(大枚舉有100多個條目,即使它它是所有調度),但可避免HashMap的初始化代碼(100個+看跌期權也是在我看來雜亂)。
而另一個選項(文檔目的)是反思:
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();
}
}
}
每一種方法都有它的權衡:
- 的HashMap =快速+有點兒凌亂( 「建立」 碼與百放)
- 枚舉=快+有點凌亂2(巨大的文件)。
- 反思=更慢+運行時錯誤容易,但提供乾淨的分離,而不訴諸笨重的大HashMap。
的命令模式來處理這種肯定的方式,請參閱: http://stackoverflow.com/questions/1199646/long-list-of-if-statements-in-java/1199677#1199677 –
究竟是什麼錯誤,除了似乎是麻煩? –