Java 圭斯。注入静态法

Java 圭斯。注入静态法,java,dependency-injection,guice,Java,Dependency Injection,Guice,我有一个实用方法: public static void MyUtility(ClassWhoDoesImportantThink instance, Object params...){...} 通常我以以下方式调用此方法: public class UsualClass{ ... @Inject ClassWhoDoesImportantThink importantInstance; ... public a

我有一个实用方法:

public static void MyUtility(ClassWhoDoesImportantThink instance, 
                             Object params...){...}
通常我以以下方式调用此方法:

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

     UtilityClass.myItility(importantInstance, arg1, arg2);
     ...
  }
}
其中@Inject是Guice特性。 但也许有一种方法可以直接向我的静态实用程序注入“importantInstance”?Smth类似:

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

MyUtility
中:

  @Inject
  static ClassWhoDoesImportantThink importantInstance;
或者,或者:

  static ClassWhoDoesImportantThink importantInstance;
  @Inject static void setImportantInstance(ClassWhoDoesImportantThink importantInstance) {
    MyUtility.importantInstance = importantInstance;
  }
并在相应的GUI模块
configure()
方法中:

  requestStaticInjection(MyUtility.class);

Guice随后将在其初始设置期间注入静态变量或setter,并且
MyUtility
静态方法可以简单地使用静态字段。

MyUtility
中:

  @Inject
  static ClassWhoDoesImportantThink importantInstance;
或者,或者:

  static ClassWhoDoesImportantThink importantInstance;
  @Inject static void setImportantInstance(ClassWhoDoesImportantThink importantInstance) {
    MyUtility.importantInstance = importantInstance;
  }
并在相应的GUI模块
configure()
方法中:

  requestStaticInjection(MyUtility.class);

然后,Guice将在初始设置期间注入静态变量或setter,并且
MyUtility
静态方法可以简单地使用静态字段。

No,您不能这样做。或者至少我非常强烈地怀疑您是否可以,因为不清楚如何以一种不完全粗俗的方式将guice注入器引入
MyUtility
。“通常”的方法有什么问题?@AndyTurner,我害怕必须将此参数从方法移动到方法,然后尝试创建更复杂的实用程序。不,你不能这样做。或者至少我非常强烈地怀疑您是否可以,因为不清楚如何以一种不完全粗俗的方式将guice注入器引入
MyUtility
。“通常”的方法有什么问题?@AndyTurner,我害怕必须在尝试创建更复杂的实用程序时将此参数从方法移动到方法。OP:请记住,您必须创建一个注入器,安装包含
requestStaticInjection
的模块才能生效(这是“初始设置”)(上面提到)并且您在静态字段中保持可变状态。正如Andy Turner在问题评论中提到的那样,重构MyUtility(例如,重构成一个一次性的、可注入的类)可能有助于保持您的代码干净。OP:请记住,您必须创建一个注入器,安装包含
requestStaticInjection
的模块才能生效(这是上面提到的“初始设置”)在静态域中保持可变状态。正如AndyTurner在问题评论中提到的,重构MyUtility(例如,进入可一次性的可注入类)可能有助于保持代码的干净。