我很久以前使用反射來從「處理程序」中解耦模塊。如何用guice替換反射?
我有一個代碼庫,其架構這樣的:
static enum AnimalHandlers {
Dog(Dog.class),
Cat(Cat.class);
private final Class c;
AnimalHandlers(Class class)
{
this.c=class;
}
public Class getAnimalHandler()
{
return c;
}
}
再後來在我的代碼,我有這需要一個「動物」枚舉作爲輸入,並使用反射(即,它得到一個方法來自enum的類並調用「newInstance」)來調用必要的處理程序。
我認爲Guice的解決方案會更清潔。我怎樣才能擺脫枚舉/反射,並簡單地使用guice「水合」我的控制模塊與域特定的邏輯處理程序?
你的例子可能是從你的真實代碼簡化過來的,但是從這個結構的方式來說,爲什麼不使用'new'?爲什麼要使用反射? – aparker42
因爲......想象一下,動物是不同類型的,並且它們的大量列表被髮送給一個將控制轉發給不同處理程序的類。你需要一個if語句,這個語句取決於被處理的動物的類型(所以你需要一個大的if塊,裏面有幾個新的語句,從而把動物循環的邏輯與動物本身結合起來,這導致了一個不可維護的系統不能被多個開發人員輕鬆擴展......並且js很難測試 – jayunit100
說實話,我認爲你的基於枚舉的解決方案並不是那麼糟糕,也許存在一些可用的模式來解決你的問題,但是我還沒有找到常見的設計模式之一,你是否每次都需要一個新的處理程序?如果你可以讓處理程序類無狀態,那麼每個枚舉常量就可以有一個實例。 –