枚举方式的线程安全的单例
1,枚举
public enum Color { blue, red, yellow }
枚举是会被另外处理的。
- 枚举只能拥有私有的构造器 枚举类实际上是一个继承Enum的一个final类
- 枚举类不允许被反序列化,Enum重写了方法
- 静态代码块中对final变量的值进行初始化
- enum类最终是一个final class
public final class voctrals.study.whatisspring.test.Color extends java.lang.Enum<voctrals.study.whatisspring.test.Color> { public static final voctrals.study.whatisspring.test.Color blue; public static final voctrals.study.whatisspring.test.Color red; public static final voctrals.study.whatisspring.test.Color yellow; public static voctrals.study.whatisspring.test.Color[] values(); // jdk给加上的 public static voctrals.study.whatisspring.test.Color valueOf(java.lang.String); // jdk给加上的 public int getValue(); static {}; }
Enum中的方法
/** * prevent default deserialization */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { throw new InvalidObjectException("can't deserialize enum"); } private void readObjectNoData() throws ObjectStreamException { throw new InvalidObjectException("can't deserialize enum"); }
2,单例模式
单例模式就是保证整个jvm中只存在唯一的一个实例。
饿汉式,在被jvm加载的过程中就已经被初始化了。静态代码块的原因。
public class BeanContainer { public static BeanContainer getInstance() { return ContainerHolder.HOLDER.instance; } private enum ContainerHolder { HOLDER; private BeanContainer instance; ContainerHolder() { instance = new BeanContainer(); } } }