在写代码时,碰到了有关单例和静态类两者之间选择的问题。今天就小小的总结一下两者的区别。
首先我大概介绍一下什么是单例模式和静态类。
单例模式是java中一种常见的设计模式,单例模式具有以下特点:
1.单例类只能有一个实例
2.单例类必须自己创建自己的唯一实例
3.单例类必须给所有其它对象提供这一实例
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例模式就是为了避免不一致状态,避免政出多头。正因为如此,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其它对象读到一致的信息。
而静态类就可以简单理解为一个所有方法都是静态方法的类。
在了解了它们是什么东西之后,你肯定很好奇这两者之间又有什么异同呢?它们俩都具有良好的访问性,并且使用时都不需要创建对象,都可以提交唯一实例。我在这里主要说说它们之间的不同。
1.单例可以被延迟初始化,在需要时加载不需要的时候销毁。而静态类速度快,通常都是在第一次加载时初始化。
2.如果你需要维护状态信息,单例比静态类更合适。
3.java中的静态方法是不可以覆盖的,没有太多的灵活性,但是单例可以通过继承和多态扩展基类,实现接口更有能力提供不同的实现。
在这里举个例子来说明,就像java.lang.Rutime,在java中它是单例,调用getRuntime()方法,会基于不同的jvm返回不同的实现,但也保证每个jvm中实有一个实例。如果它是一个静态类的话,不太可能因不同的jvm返回不同的实现。
那么它们更适合在什么不同的情况下使用呢?
如果你的单例不需要维护任何状态信息,仅仅提供全局访问的方法或者需要将一些工具方法集中在一起时,这种情况可以考虑使用静态类。因为静态方法比单例更快,因为静态的绑定是在编译期就进行的。并且不要在静态类中维护状态信息,特别是在并发环境中,若无适当的同步措施而修改多线程并发时,会导致坏的竞态条件。但是别的东西要求单例访问资源时,应该使用单例模式。