设计模式Java Singleton vs static是否有真正的性能优势?
我正在合并一个CVS分支,其中一个更大的变化是,无论在哪里出现单例模式,都将其替换为具有静态初始化块和所有静态方法的抽象类
这是值得保留的东西吗?因为它需要合并很多冲突,我会在什么样的情况下进行重构
我们在Weblogic 8.1(即JDK 1.4.2)下运行这个应用程序
对不起,托马斯,让我澄清一下
HEAD版本有传统的单例模式(私有构造函数、getInstance()等)
分支版本没有构造函数,是一个“公共抽象类”,并将对象上的所有方法修改为“静态”。过去存在于私有构造函数中的代码被移动到静态块中
然后,该类的所有用法都会发生更改,从而导致合并中出现多个冲突
在一些情况下做出了这种改变
# 1 楼答案
从严格的运行时性能角度来看,这种差异实际上可以忽略不计。两者之间的主要区别在于,“静态”生命周期与类加载器相关联,而对于单例来说,它是一个常规的实例生命周期。通常最好远离ClassLoader业务,避免一些棘手的问题,尤其是在尝试重新加载web应用程序时
# 2 楼答案
如果我最初的帖子是正确的理解,而Sun的讨论是准确的(我认为可能是这样),那么我认为你必须在清晰度和性能之间做出权衡
问自己以下问题:
# 3 楼答案
根据我的经验,唯一重要的是哪一个更容易在单元测试中模仿。我一直觉得单身更容易被嘲笑,也更自然。如果您的组织允许您使用JMockit,这并不重要,因为您可以克服这些顾虑
# 4 楼答案
这个讨论有用吗?(我不知道链接到另一个编程论坛是否是禁忌,但我宁愿不只是引用整个讨论=))
Sun Discussion on this subject
结论似乎是,在大多数情况下,它并没有产生足够的影响,尽管从技术上讲,静态方法更有效
# 5 楼答案
如果需要存储任何状态,我将使用单例,否则将使用静态类。实例化某个东西是没有意义的,即使是单个实例,除非它需要存储某些东西
# 6 楼答案
静态不利于扩展性,因为静态方法和字段不能由子类扩展或重写
这也不利于单元测试。在单元测试中,由于无法控制类加载器,因此无法防止不同测试的副作用溢出。在一个单元测试中初始化的静态字段将在另一个单元测试中可见,或者更糟的是,同时运行测试将产生不可预测的结果
如果使用较少,单例模式通常是ok模式。我更喜欢使用DI框架,让它为我管理实例(可能在不同的范围内,比如在Guice中)