2016-02-15 53 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(例如,将其转换为一次性注射类)可能有助于保持代码清洁。 –