package java.util; import sun.misc.SharedSecrets; //抽象枚举Set类,继承AbstractSet public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E> implements Cloneable, java.io.Serializable { final Class<E> elementType; final Enum<?>[] universe;//缓存枚举类 private static Enum<?>[] ZERO_LENGTH_ENUM_ARRAY = new Enum<?>[0]; EnumSet(Class<E> elementType, Enum<?>[] universe){ this.elementType = elementType; this.universe = universe; } //创建一个空的枚举Set类,容量小于等于64,创建的是RegularEnumSet,否则创建的JumboEnumSet public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType){ Enum<?>[] universe = getUniverse(elementType); if(universe == null) throw new ClassCastException(elementType + " not an enum"); if(universe.length <= 64) return new RegularEnumSet<>(elementType, universe); else return new JumboEnumSet<>(elementType, universe); } //构造一个包含枚举类中所有枚举项的集合 public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType){ EnumSet<E> result = noneOf(elementType); result.addAll(); return result; } //将元素添加到枚举set中,调用前为空 abstract void addAll(); //由EnumSet创建它clone public static <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s){ return s.clone(); } //由一个集合创建EnumSet public static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c){ if(c instanceof EnumSet){ return ((EnumSet<E>) c).clone(); }else{ if(c.isEmpty()) throw new IllegalArgumentException("Collection is empty"); Iterator<E> i = c.iterator(); E first = i.next(); EnumSet<E> result = EnumSet.of(first); while (i.hasNext()) result.add(i.next()); return result; } } //由一个EnumSet s创建EnumSet public static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s){ EnumSet<E> result = copyOf(s); result.complement(); return result; } //创建一个包含e的EnumSet public static <E extends Enum<E>> EnumSet<E> of(E e){ EnumSet<E> result = noneOf(e.getDeclaringClass()); result.add(e); return result; } //创建一个包含e1,e2的EnumSet public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2){ EnumSet<E> result = noneOf(e1.getDeclaringClass()); result.add(e1); result.add(e2); return result; } //创建一个包含e1,e2,e3的EnumSet public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3){ EnumSet<E> result = noneOf(e1.getDeclaringClass()); result.add(e1); result.add(e2); result.add(e3); return result; } //创建一个包含e1,e2,e3,e4的EnumSet public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4){ EnumSet<E> result = noneOf(e1.getDeclaringClass()); result.add(e1); result.add(e2); result.add(e3); result.add(e4); return result; } //创建一个包含e1,e2,e3,e4,e5的EnumSet public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5){ EnumSet<E> result = noneOf(e1.getDeclaringClass()); result.add(e1); result.add(e2); result.add(e3); result.add(e4); result.add(e5); return result; } //创建至少包含first,rest元素的EnumSet, @SafeVarargs public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest){ EnumSet<E> result = noneOf(first.getDeclaringClass()); result.add(first); for(E e : rest){ result.add(e); } return result; } //创建EnumSet,将[from,to]中所有元素都添加 public static <E extends Enum<E>> EnumSet<E> range(E from, E to){ if(from.compareTo(to) > 0) throw new IllegalArgumentException(from + " > " + to); EnumSet<E> result = noneOf(from.getDeclaringClass()); result.addRange(from, to); return result; } abstract void addRange(E from, E to); //返回this的clone,super.clone是浅复制 @SuppressWarnings("unchecked") public EnumSet<E> clone(){ try { return (EnumSet<E>) super.clone(); } catch (CloneNotSupportedException e) { throw new AssertionError(e); } } /** * Complements the contents of this enum set. */ abstract void complement(); //当类型不匹配,抛出此异常 final void typeCheck(E e){ Class<?> eClass = e.getClass(); if(eClass != elementType && eClass.getSuperclass() != elementType) throw new ClassCastException(eClass + " != " + elementType); } //缓存element到Enum数组中 private static <E extends Enum<E>> E[] getUniverse(Class<E> elementType){ return SharedSecrets.getJavaLangAccess() .getEnumConstantsShared(elementType); } //快照序列化 private static class SerializationProxy<E extends Enum<E>> implements java.io.Serializable { /** * The element type of this enum set. * * @serial */ private final Class<E> elementType; /** * The elements contained in this enum set. * * @serial */ private final Enum<?>[] elements; SerializationProxy(EnumSet<E> set){ elementType = set.elementType; elements = set.toArray(ZERO_LENGTH_ENUM_ARRAY); } // instead of cast to E, we should perhaps use elementType.cast() // to avoid injection of forged stream, but it will slow the implementation @SuppressWarnings("unchecked") private Object readResolve(){ EnumSet<E> result = EnumSet.noneOf(elementType); for(Enum<?> e : elements){ result.add((E) e); } return result; } private static final long serialVersionUID = 362491234563181265L; } Object writeReplace(){ return new SerializationProxy<>(this); } // readObject method for the serialization proxy pattern // See Effective Java, Second Ed., Item 78. private void readObject(java.io.ObjectInputStream stream) throws java.io.InvalidObjectException{ throw new java.io.InvalidObjectException("Proxy required"); } }