枚舉方式的線程安全的單例

1,枚舉

public enum Color {
    blue, red, yellow
}

枚舉是會被另外處理的。java

  • 枚舉只能擁有私有的構造器
  • 枚舉類其實是一個繼承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中的方法spring

    /**
     * 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

餓漢式,在被jvm加載的過程當中就已經被初始化了。靜態代碼塊的緣由。spa

public class BeanContainer {

    public static BeanContainer getInstance() {
        return ContainerHolder.HOLDER.instance;
    }

    private enum ContainerHolder {
        HOLDER;
        private BeanContainer instance;

        ContainerHolder() {
            instance = new BeanContainer();
        }
    }
}
相關文章
相關標籤/搜索