在设计服务类时,它应该是java中的单例吗?一般来说DAO是单例的,所以调用Service类也应该是单例吗?
答案 0 :(得分:7)
恕我直言,服务不应该保持状态,因此应该成为单身人士。
答案 1 :(得分:1)
单身者是坏的,如果你发展它们。如果使用依赖项注入,请让DI容器处理Service对象的单例性质。如果您不使用依赖注入,请使用静态方法而不是单例。
坏的典型例子:
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)。
编辑:如果我使用的是spring,我会选择singleton范围(默认值)。
答案 2 :(得分:0)
否强>
实际上我相信你在设计时不应该关心它。像 @DwB 提到的 DI 框架应该做这个工作。此外,我相信没有范围(“prototype”)应该是默认的,如果有人自己创建它,我看不出任何不好的东西。 此外,这个问题可以通过模块化和分离服务接口和实现来简化,就像所说的最佳实践一样。