gpt4 book ai didi

java - Enum 单例有惩罚吗?

转载 作者:行者123 更新时间:2023-11-30 06:00:31 25 4
gpt4 key购买 nike

是否存在与 Enum Singleton Pattern 相关的(性能)处罚*无论如何,它似乎比经典的单例模式或内部持有者类习惯用法更少使用?

* 惩罚,例如在不需要时的可串行化成本等,或者使用率较低,因为很少有开发人员阅读Effective Java 第二版?

最佳答案

所有 Java 单例模式(包括私有(private)构造函数和静态访问器的标准)都有这个不好的属性,如果您测试它们(或测试任何远程依赖于它们的东西),只能使用这个对象。

例如,如果您想测试依赖于 PrintingSingletonPrintingService 类,您将无法用模拟替换此打印单例,因为它是静态绑定(bind)的。

即想象一下测试这个功能

boolean printDocument(Document d) {
if (PrintingSingleton.INSTANCE.isPrinterEnabled()) {
PrintingSingleton.INSTANCE.print(d);
}
throw new RuntimeExeption("Printing not enabled");
}

通过测试

@Test(expectedExceptions = {RuntimeException.class})
public void testPrinting() {
PrintingService service = ...
service.print(new Document()); // How will you simulate
// throwing an exception?
}

就我个人而言,我会避免以这种方式使用单例,而是通过 Guice、Spring 或 Pico Container 引入依赖注入(inject)。这样您就可以确保只存在一个对象,同时不会限制自己无法模拟该对象(例如用于测试)。

关于java - Enum 单例有惩罚吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1149633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com