我正在合并一个CVS分支,其中一个较大的变化是用具有静态初始化块和所有静态方法的抽象类替换出现的Singleton模式。
这是值得保留的东西吗?因为它需要合并许多冲突,我应该考虑什么样的情况才是值得进行这种重构的?
我们在Weblogic 8.1 (因此JDK 1.4.2)下运行此应用程序。
对不起,托马斯,让我澄清一下..
HEAD版本具有传统的单例模式(私有构造函数、getInstance()等)
分支版本没有构造函数,它是一个“公共抽象类”,并将对象上的所有方法都修改为“static”。过去存在于私有构造函数中的代码被移动到静态块中。
然后更改类的所有使用,这会导致合并中的多个冲突。
在少数情况下进行了此更改。
发布于 2008-08-26 14:52:02
从严格的运行时性能角度来看,差异实际上可以忽略不计。两者之间的主要区别在于“静态”生命周期是链接到类加载器的,而对于单例,它是一个常规的实例生命周期。通常情况下,最好远离ClassLoader业务,避免一些棘手的问题,特别是当您尝试重新加载web应用程序时。
发布于 2008-08-26 14:59:21
如果需要存储任何状态,我会使用单例,否则使用静态类。实例化一些东西是没有意义的,即使是一个单独的实例,除非它需要存储一些东西。
发布于 2008-08-26 17:52:52
静态不利于可扩展性,因为静态方法和字段不能被子类扩展或覆盖。
这也不利于单元测试。在单元测试中,您无法避免不同测试的副作用溢出,因为您无法控制类加载器。在一个单元测试中初始化的静态字段将在另一个单元测试中可见,或者更糟糕的是,并发运行测试将产生不可预测的结果。
在谨慎使用时,Singleton通常是一个可以接受的模式。我更喜欢使用DI框架,让它为我管理我的实例(可能在不同的作用域中,比如Guice)。
https://stackoverflow.com/questions/28241
复制相似问题