[英]How can I replace reflection with 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;
}
}
然后在我的代碼中,我有一個方法,它將“Animal”枚舉作為輸入並使用反射(也就是說,它從枚舉中獲取類並調用“newInstance”)來調用必要的處理程序。
我認為Guice的解決方案會更清晰。 如何擺脫枚舉/反射,只需使用guice用特定於域的邏輯處理程序“保濕”我的控制模塊?
您可以使用MapBinder<AnimalEnum, AnimalHandler>
,並為每個可能的AnimalEnum
值定義綁定。
我認為這里必須有一個更好的模式。 我對Animal
枚舉如何與處理程序接口感到有點困惑,但我會提出一些一般性的建議,也許會堅持下去。
Animal
枚舉中定義處理程序,並且您想要分離類。 精細。 Animal.setHandler(...)
注冊自己嗎? 然后你可以調用Animal.Dog.getHandler()
來獲取Dog的處理程序。 AnimalHandlerMapper
也會更好。 我假設有一個共同的接口是可能的,即使它只是一個標記接口。 碼:
private static Map<Animal, AnimalHandler> handlerMap
= new HashMap<Animal, AnimalHandler>();
static {
Dog dog = new Dog();
handlerMap.put(Animal.Dog, dog);
// we use the same handler twice here
handlerMap.put(Animal.Wolf, dog);
handlerMap.put(Animal.Cat, new Cat());
// do a Animal.values loop at the end to verify that everyone has a handler
}
public static AnimalHandler getHandler(Animal animal) {
return handlerMap.get(animal);
}
handlerMap.get(animal).create(animal)
或其他一些。 這比使用反射更清潔。 AnimalHandlerMapper
以完全解耦它。 希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.