java - 将单例用于不可变的无参数类不好吗?

标签 java oop singleton immutability single-instance

我现在正在开发一个小型 Java 项目,同时在那里创建了多个类,这些类代表某种常量行为,例如用作其他方法的默认返回值。

现在所有这些的共同点是,它们是完全不可变的,并且它们只有一个无参数构造函数。这意味着创建该类的多个实例将始终产生相同的对象。

是每次使用这些类时只创建一个新实例更好还是使用单例模式是可以接受的情况?

最佳答案

假设您有一个小项目和用作默认返回值的不可变类,让我们考虑单例的优缺点。

优点在这种情况下单例:

  • 应用程序构建一个对象而不是多个; 请记住,通常构造一个新对象在 Java 中是一种廉价操作。 如果您的对象生命周期不长,GC 将收集它们而不会对您的应用程序的性能产生重大影响。如果您不必每秒创建数千个此类对象,这就适用。

缺点:

  • 更多代码读写; 虽然编写 getInstance() 方法可能看起来没什么大不了,但其他(可能)与您一起工作的人会花一些时间探索 getInstance() 在修复错误时的真正作用或者只是了解一些业务逻辑。我见过许多令人惊讶的 getInstance() 方法,尽管它们有一个传统的名称。

  • 潜在的并发问题; 即使您的项目很小,您也可能希望使用多个线程。在这种情况下,您必须将 getInstance() 编写为同步方法,引入 double-checked locking ,使用枚举或其他东西。 即使您知道这种特殊性,也不能保证其他开发人员不会犯错误。

所以我认为没有单一的正确答案,这取决于你如何看待你的项目 future 的发展。

关于java - 将单例用于不可变的无参数类不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54189956/

相关文章:

java - 减少大量字符串的垃圾收集器开销

swift - 为什么在协议(protocol)中定义的重写方法会在父类中调用,而不是在子类中调用?

.net - 多次初始化单例

java - 将 SQL 查询中的列名称/值解析为 HashMap <String, String>

java - 无法解析方法 openFileInput(Android 开发)

java - new in 循环会删除旧对象吗?

javascript,对象,将函数作为参数传递 - Angular ,jquery 概念基本误解

swift - 单例关闭修改开放扩展

java - 这个nullPointerException的原因是什么?

java - JSSC串行连接设置写入超时