使用Google Guice和静态方法注入Util类?

我想知道用google guice注入实用程序方法是否是一种好方法。

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

public class UtilClass { public static Result convert(Source src) { //Do conversion return result; } } 

我的想法是使用guice将这个实用程序注入像这样的Singleton

 @Singleton public class UtilClass { public Result convert(Source src) { //Do conversion return result; } } 

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

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

如果是的话

  • 简单
  • 确定性的(即不依赖于其他参数)
  • 没有副作用
  • 不太可能改变
  • 等等

您可以将其保留为静态实用程序方法。

否则它是dependency injection的良好候选者(您可以将其重命名为ConversionService以使其更清晰)。

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

无论如何,如果UtilClass是无状态的,我只是将其注入而不是单身。 注入非单例比注入单例更快。 也许如果您要将注入的实例存储在许多其他类中,单例可能有助于节省空间。

就个人而言,我通常试图不让我的应用程序连接使用dependency injection框架来影响我为我的类等做出的设计决策。良好的设计实践应该指明这一点。 在你的情况下,似乎你的实用程序类不依赖于状态,因此它似乎是一个明智的候选者保持静态。

无论如何,您的实用程序类不是任何接口的实现,因此使用它的客户端代码仍具有紧密耦合的依赖性。 有了这个,很难看出使用DI注入实用程序类有什么好处,而不是直接在客户端代码中引用静态类。