Java 使用GoogleGuice和静态方法注入Util类?

Java 使用GoogleGuice和静态方法注入Util类?,java,static,dependency-injection,guice,Java,Static,Dependency Injection,Guice,我想知道用GoogleGuice注入实用方法是否是一种好的风格 假设我们有一个转换器实用程序类: public class UtilClass { public static Result convert(Source src) { //Do conversion return result; } } 我的想法是使用guice将此实用程序作为单例注入,如下所示 @Singleton public class UtilClass { public Result

我想知道用GoogleGuice注入实用方法是否是一种好的风格

假设我们有一个转换器实用程序类:

public class UtilClass
{
  public static Result convert(Source src)
  {
    //Do conversion

    return result;
  }
}
我的想法是使用guice将此实用程序作为单例注入,如下所示

@Singleton
public class UtilClass
{
  public Result convert(Source src)
  {
    //Do conversion

    return result;
  }
}

对于使用guice构建的应用程序,建议采用哪种方式?

这取决于
convert()
方法的性质

如果是什么

  • 简单的
  • 确定性(即不依赖于其他参数)
  • 没有副作用
  • 不太可能改变
您可以将其作为静态实用程序方法保留


否则,它是依赖注入的一个很好的候选者(您可以将其重命名为
ConversionService
,以使其更清晰)。

首先,您注入此实用程序类的实例而不是继续使用现有的静态方法的目的是什么?具有输入和输出且无副作用的函数通常是最好的静态方法。这就是说,也许您希望能够更改此方法用于测试或类似测试的功能。在这种情况下,您通常希望该类实现您在客户机类中使用的一些接口


无论如何,如果
UtilClass
是无状态的,我就不把它作为一个单例注入。注入非单例比注入单例快。如果您要将注入的实例存储在许多其他类中,那么单例可能有助于节省空间。

就我个人而言,我通常不会让我的应用程序使用依赖项注入框架连接的事实影响我为类等所做的设计决策。良好的设计实践应该规定这一点。在您的情况下,您的实用程序类似乎不依赖于状态,因此保持静态似乎是明智的选择


不管怎样,实用程序类不是任何接口的实现,因此使用它的客户机代码仍然具有紧密耦合的依赖关系。这样就很难看出使用DI注入实用程序类的好处是什么,而不是直接在客户机代码中引用静态类

感谢您澄清单例注入问题!