1.枚举
枚举:用于存放常量
2.代码实现
public enum Singleton {
INSTANCE;
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
就是这么简单,将单例INSTANCE
定义为枚举常量,同时单例INSTANCE
可以拥有自定义的一些属性(这样这个枚举常量就跟我们用到的对象相差无几了,都能拥有属性,且都可以对属性进行操作),例如上面代码中的name属性
3.代码测试
public class TestDemo {
public static void main(String[] args) {
Singleton s1 = Singleton.INSTANCE;
Singleton s2 = Singleton.INSTANCE;
System.out.println("s1 == s2: " + (s1 == s2)); // s1 == s2: true
s1.setName("张三");
System.out.println("s1 name: " + s1.getName()); // s1 name: 张三
System.out.println("s2 name: " + s2.getName()); // s2 name: 张三
}
}
在这,可以看到,s1和s2相等,符合单例的特性,同时可以设置name属性
4.总结
- 优点
- 实现简单
- 线程安全
- 支持高并发
- 用枚举实现单例能天然防止反射和反序列化对单例的破坏,所以推荐使用枚举实现单例(后续两章将讲解反射和反序列化对单例的破坏)
- 缺点
- 不支持延迟加载