2011-10-23 18 views
3

我很久以前使用反射來從「處理程序」中解耦模塊。如何用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「水合」我的控制模塊與域特定的邏輯處理程序?

+1

你的例子可能是從你的真實代碼簡化過來的,但是從這個結構的方式來說,爲什麼不使用'new'?爲什麼要使用反射? – aparker42

+0

因爲......想象一下,動物是不同類型的,並且它們的大量列表被髮送給一個將控制轉發給不同處理程序的類。你需要一個if語句,這個語句取決於被處理的動物的類型(所以你需要一個大的if塊,裏面有幾個新的語句,從而把動物循環的邏輯與動物本身結合起來,這導致了一個不可維護的系統不能被多個開發人員輕鬆擴展......並且js很難測試 – jayunit100

+0

說實話,我認爲你的基於枚舉的解決方案並不是那麼糟糕,也許存在一些可用的模式來解決你的問題,但是我還沒有找到常見的設計模式之一,你是否每次都需要一個新的處理程序?如果你可以讓處理程序類無狀態,那麼每個枚舉常量就可以有一個實例。 –

回答

2

您可以很好地使用MapBinder<AnimalEnum, AnimalHandler>,併爲每個可能的AnimalEnum值定義綁定。

+0

嗯...我意識到這並沒有完全回答這個問題:因爲我想要替換枚舉 - 我不需要它 - 我只需要一個類的列表,我想讓我爲我做醜陋的反射工作。這是可能/> – jayunit100

+0

嗯,我不知道我完全理解你想要什麼。你可以使用MultiBinder ,但你怎麼知道使用哪個處理程序,並基於什麼?你肯定需要用一個具體的用例來澄清你的問題,或者更好的,提出一個新的問題。 – jfpoilpret

2

我認爲這裏一定有更好的模式。我有點困惑,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進行註冊,以完全解耦它。

希望這會有所幫助。