在 java 中,服务类应该是单例吗?

2022-09-04 21:29:03

在设计服务类时,它应该是java中的单例吗?通常 DAO 是单例的,那么调用的服务类也应该成为单例吗?


答案 1

恕我直言,是的,服务不应该保持状态,因此应该成为单例。


答案 2

单例是坏的,如果你开发它们。如果使用依赖关系注入,请让 DI 容器处理服务对象的单一实例性质。如果不使用依赖关系注入,请使用静态方法而不是单例。

坏的典型例子:

public class HootUtility // singleton because developer was a goofball.
{
   ...
   public void blammy(...) { ... }
   public HootUtility getInstance() { ... }
}

... somewhere in the code.

HootUtility.getInstance().blammy(...);  // This is silly.

更好地实现上述内容:

public class HootUtility // Not a singleton because I am not a ______. (fill in the blank as you see fit)
{
  // You can limit instantiation but never prevent instantiation.
  // google "java reflection" for details.
  private HootUtility()
  {
    throw new UnsuppotedOperationException();
  }

  public static void blammy(...) { ... }
}

... somewhere in the code.

HootUtility.blammy(...);

如果您有一个具有具体实现的服务接口,请使用依赖关系注入框架来注入实现(DI 框架包括:spring 和 guice)。

编辑:如果我使用弹簧,我会选择单例范围(默认值)。


推荐