单例模式共有8中实现方式,其中大家最常见到的可能是双重检查模式,但是最优秀的应该是本文的主角枚举了。最亮眼的优秀在于:
enum Singletone{
INSTANCE;
}
三行代码即可搞定,对比双重检查方便太多了而且,它具有以下优点:
- 懒加载
- 避免线程安全问题,
- 避免反序列化破坏的问题,
- 避免反射破坏的问题。
- So eazy!
关于懒加载,本人查阅了很多文章没有给出明确的说明,在StaciOverflow上找到了明确的说明:
并证明了枚举是懒加载:
package designpattner;
public class Singletone_enum {
enum SingletoneENUM {
INSTANCE;
static {
System.out.println("enum loading...");
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("beging sleeping for 5 seconds");
Thread.sleep(5000);
System.out.println("wake up!");
SingletoneENUM ins = SingletoneENUM.INSTANCE;
System.out.println("done!");
}
}
//输出:
//beging sleeping for 5 seconds
//wake up!
//enum loading...
//done!
解释:主线程sleep5秒后,保证系统预先加载的内容已经加载完毕。这个时候系统并没有输出静态代码块中的内容(wake up 后才输出)。说明在调用前并未被加载!(静态代码块中的内容在类被加载时才会运行。)
至于其他优点的解释,可以查看一个大佬的博文单例设计模式 - 8中方式以及 - 单例优化
补充:使用枚举的单例模式:
public class Singletone_enum {
enum SingletoneENUM {
INSTANCE;
public void show(){
System.out.println("go");
}
}
public static void main(String[] args) throws InterruptedException {
SingletoneENUM instance = SingletoneENUM.INSTANCE;
instance.show()
}
}