2016-02-15 87 views
1

我有一個實用的方法:Guice。注入到靜態方法

public static void MyUtility(ClassWhoDoesImportantThink instance, 
          Object params...){...} 

通常我把這種方法方式:

public class UsualClass{ 
    ... 
    @Inject 
    ClassWhoDoesImportantThink importantInstance; 
    ... 
    public aMethod(){ 
    ... 

    UtilityClass.myItility(importantInstance, arg1, arg2); 
    ... 
    } 
} 

哪裏@Inject是吉斯功能。 但也許它存在一種方法直接注入一個「importantInstance」到我的靜態工具?不便,如:

public static void MyUtility(Object params...){ 
    ClassWhoDoesImportantThink instance = 
    GuiceFeature.getObjectUsuallyInjected(ClassWhoDoesImportantThink.class); 
    ... //Do job 
} 
+0

不,你不能這樣做。或者至少我非常懷疑你可以這樣做,因爲如何讓guice注入器以不完全的方式進入MyUtility是不明顯的。 「常用」方式有什麼問題? –

+0

@AndyTurner,我很害怕必須從方法中移動這個參數,通過方法嘗試創建一個更復雜的工具。 –

回答

3

MyUtility

@Inject 
    static ClassWhoDoesImportantThink importantInstance; 

,或者可選地:

static ClassWhoDoesImportantThink importantInstance; 
    @Inject static void setImportantInstance(ClassWhoDoesImportantThink importantInstance) { 
    MyUtility.importantInstance = importantInstance; 
    } 

和適當吉斯模塊中configure()方法:

requestStaticInjection(MyUtility.class); 

吉斯將然後在初始設置期間注入靜態變量或設置器,並且靜態方法可以簡單地使用靜態字段。

+0

OP:請記住,您必須創建一個Injector來安裝包含'requestStaticInjection'的模塊,以使其生效(這是上面提到的「初始設置」),並且您在靜態字段中保持可變狀態。正如Andy Turner在問題評論中提到的,重構MyUtility(例如,將其轉換爲一次性注射類)可能有助於保持代碼清潔。 –