当前位置: 首页 > 知识库问答 >
问题:

为什么在Java代码中实现单例模式(有时)在Java世界中被认为是反模式?

郎思远
2023-03-14

我曾看到一些人这样评论单例模式是一种反模式。我想知道为什么?

共有1个答案

吴均
2023-03-14

测试

一个原因是单件不容易处理单元测试。您无法控制实例化,而且它们的本质可能会在调用之间保留状态。

由于这个原因,依赖注入的原则很受欢迎。每个类都注入(配置)了它们需要的类(而不是通过单例访问器派生),因此测试可以控制使用哪些依赖的类实例(并在需要时提供模拟)。

public class Portfolio {
   private Calculator calc = Calculator.getCalculator();
}
public class Portfolio {
   public Portfolio(Calculator c) {
      this.calc = c;
   }
}

通过将自己限制为对象的一个实例,线程化的选项就受到了限制。可能必须保护对单例对象的访问(例如,通过同步)。如果您可以维护这些对象的多个实例,那么您就可以根据您所运行的线程来定制实例的数量,并增加代码库的并发功能。

 类似资料:
  • 问题内容: 在Java中实现单例模式的有效方法是什么? 问题答案: 使用一个枚举: 约书亚·布洛赫(Joshua Bloch)在Google I / O 2008上的“ 有效的Java重新加载”演讲中解释了这种方法:链接到视频。另请参见他的演示文稿的幻灯片30-32(effective_java_reloaded.pdf): 实现可序列化单例的正确方法 编辑: “有效Java” 的在线部分说: “

  • 问题内容: 谁能提供一个单例模式的示例并解释为什么有必要吗? 问题答案: 在走单身路线之前,请重新考虑。您真的需要单身人士吗?如果您需要实现单例的方案,那是因为对它们的需求并没有真正表达出来。您最好不要仅在代码库中引入单例,因为遵循设计模式会很酷。 干净的代码讨论-全局状态和单例 一次还不够 表演者单身人士 但是,真正值得了解的是Dependency Injection 。 现在,如果您真的想用J

  • 本文向大家介绍Java单例模式、饥饿模式代码实例,包括了Java单例模式、饥饿模式代码实例的使用技巧和注意事项,需要的朋友参考一下

  • 问题内容: 我刚刚看过有关Inside的讨论。 您可以看到该函数之后,该函数将被React调用。当您进行呼叫时,不仅使整个组件树都被重新渲染,不仅是当前组件- 别忘了,当前组件刚刚完成了渲染。 有些人建议把电话打进去。在某些情况下,我想获取渲染元素的高度并将其存储为状态,而上述方法将不起作用。我还浏览了React的官方网站,它建议在内部进行Ajax调用,这再次违背了上述想法。 那么,放进去我是否错

  • 问题内容: 建议在处理现实世界的货币值时,使用BigDecimal而不是Double。但是我没有令人信服的解释,只是“通常是这样做的”。 您能谈谈这个问题吗? 问题答案: 这称为精度损失,在处理非常大的数字或非常小的数字时非常明显。在许多情况下,带小数的十进制数字的二进制表示形式是近似值,而不是绝对值。要了解为什么需要阅读二进制形式的浮点数表示形式。这是链接:http : //en.wikiped

  • 问题内容: 为什么在类中声明的变量具有默认值,但是在方法内部声明的变量(称为“局部变量”)在Java中没有默认值? 例如 在上面的示例中,变量的默认值为0,但是变量给出了可能尚未初始化的错误。 问题答案: 所有成员变量都必须加载到堆中,因此在创建类的实例时必须使用默认值进行初始化。对于局部变量,它们不会被加载到堆中,直到在Java7之前被使用,它们才会存储在堆栈中,因此我们需要显式初始化它们。现在