我正在合并一个CVS分支,其中一个较大的更改是使用具有静态初始化块和所有静态方法的抽象类的Singleton模式发生的替换.
这是值得保留的东西,因为它需要合并很多冲突,我会考虑什么样的情况才能使这种重构变得有价值?
我们在Weblogic 8.1下运行这个应用程序(所以JDK 1.4.2)
对不起托马斯,让我澄清一下..
HEAD版本具有传统的单例模式(私有构造函数,getInstance()等)
分支版本没有构造函数,是一个"公共抽象类",并将对象上的所有方法都修改为"静态".以前存在于私有构造函数中的代码将移动到静态块中.
然后更改类的所有用法,这会导致合并中出现多个冲突.
有一些情况发生了这种变化.
如果需要存储任何状态,我会使用单例,否则使用静态类.除非需要存储某些内容,否则实例化某些内容(即使是单个实例)也没有意义.
从严格的运行时性能角度来看,差异实际上可以忽略不计.两者之间的主要区别在于"静态"生命周期与类加载器相关联,而对于单例,它是常规实例生命周期.通常最好远离ClassLoader业务,避免一些棘手的问题,尤其是当您尝试重新加载Web应用程序时.
静态不利于可扩展性,因为子类不能扩展或覆盖静态方法和字段.
它对于单元测试也很糟糕.在单元测试中,由于无法控制类加载器,因此无法防止不同测试的副作用溢出.在一个单元测试中初始化的静态字段将在另一个单元测试中可见,或者更糟糕的是,同时运行的测试将产生不可预测的结果.
单调使用时通常是一种好的模式.我更喜欢使用DI框架,让我为我管理我的实例(可能在不同的范围内,如在Guice中).