簡體   English   中英

如何用guice替換反射?

[英]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的處理程序。
  • 我同意@jfpoilpret,某種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)或其他一些。 這比使用反射更清潔。
  • 我不確定Guice如何與Spring相比,但如果這是春天,我將實例化處理程序bean,他們將注冊AnimalHandlerMapper以完全解耦它。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM