Перечисление
Enumset - это общий контейнер с типа Java Enum. Поскольку у Java есть SortedSet, Treesset, Hashset и другие контейнеры, зачем ей дополнительный перечисление <t>? Ответ заключается в том, что перечисление имеет определенные характеристики. Например, перечисление очень быстро. Я не буду перечислять другие функции один за другим, в конце концов, содержание этой статьи не представляет функции перечисления.
Классы сбора, разработанные специально для классов перечисления, все элементы должны быть типами перечисления
Установленные элементы перечисления упорядочены и хранятся внутренне векторами, поэтому они занимают меньше памяти и имеют высокую эффективность.
Нулевые элементы не допускаются
Исходный код
пакет java.util; import sun.misc.sharedsecrets; публичный абстрактный класс Enumset <E Extends enum <e >> расширяет AbstractSet <e> реализует клонируемый, java.io.serializable { / *** Тип элемента* / final Class <e> elementtype; / *** Хранить элементы через массив*/ final enum [] вселенная; Приватный статический enum [] Zero_length_enum_array = new enum [0]; Enumset (class <e> elementtype, enum [] ulianse) {this.elementType = elementType; this.universe = вселенная; }/** * Создать пустой набор перечисления и сформулировать тип его элемента * @param elementtype, объект класса типа элемента для этого перечисления * set * @throws nullpointerexception if <tt> elementtype </tt> is null */public static <e Engum enum <e >> enumset <e> noneof (class <e> elementpe) {inum <e >> enumset <e> noneof (class <e> elementpe) getuniverse (elementtype); if (Universe == null) бросить новое ClasscastException (elementType + "не перечисление"); if (Universe.length <= 64) вернуть новый rightEnumset <> (elementType, Universe); иначе вернуть новый jumboenumset <> (elementtype, Universe); }/** * Создать перечисление, содержащее все элементы в установленном наборе типа элемента * * @param elementtype, объект класса типа элемента для этого перечисления * set * @throhs nullpointerexception if <tt> elementtype </tt> null */public static <e extends enum <e >> enumset <e> allof (class <e> elementpe) ementepe) inumsemete <e >> enumset <e> allof <e> element nonof (elementtype); result.addall (); результат возврата; } /** * Добавляет все элементы из соответствующего типа Enum в этот набор enum *, который пуст перед вызовом. */ Abstract void addall (); /** * Создать набор перечисления с тем же типом элемента, что и указанный набор перечисления * * @param s enum set, с которого можно инициализировать этот набор enum * @throws nullpointerexception, если <tt> s </tt> null */public static <e extends enum <e >> enumset <e> копию (enumset <e> s) {return s.clone (););););););););););););););); } /** * Create an enum set from which to initialize this enum set * @throws IllegalArgumentException if <tt>c</tt> is not an * <tt>EnumSet</tt> instance and contains no elements * @throws NullPointerException if <tt>c</tt> is null */ public static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c) {if (c ancessionof enumset) {return ((enumset <e>) c) .clone (); } else {if (c.isempty ()) бросить new allogalargumentException («Коллекция пуста»); Итератор <e> i = c.iterator (); E First = i.Next (); Enumset <e> result = enumset.of (первое); while (i.hasnext ()) result.add (i.next ()); результат возврата; }}/** * Создать набор перечисления из комплемента которого для инициализации этого набора перечисления * @Throws nullPointerException, если <tt> s </tt> является null */public static <e enumse <e >> enumset <e> комплемента (enumset <e> s) {enumset <e> resultof (s); result.complement (); результат возврата; }/** * 1 Коллекция перечисления элементов * * @param e Элемент, который этот набор должен содержать изначально * @Throws NullPointerException, если <tt> e </tt> null * @return enum, изначально содержащий указанный элемент */public enum enum <e >> enumse <e> (e e) {enum enum enum = enumset = enumslet = enum = enum = enum = enum = enum = enum = enum = enum = enum = enum = enum enum <e> enum enum <e >> enum <e> nonof (e.getdeclaringclass ()); result.add (e); результат возврата; } /** * 2 element enumeration collection* * @param e1 an element that this set is to contain initially * @param e2 another element that this set is to contain initially * @throws NullPointerException if any parameters are null * @return an enum set initially containing the specified elements */ public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) { Enumset <e> result = neOf (e1.getDeclaringClass ()); result.add (e1); result.add (e2); результат возврата; } /** * 3 element enumeration collection* * @param e1 an element that this set is to contain initially * @param e2 another element that this set is to contain initially * @param e3 another element that this set is to contain initially * @throws NullPointerException if any parameters are null * @return an enum set initially containing the specified elements */ 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); результат возврата; } / ** * 4 4 Набор Enmeration Enmeration * @param e1 Элемент, который этот набор должен содержать изначально * @param e2 Другой элемент, который этот набор должен содержать изначально * @param e3 Другой элемент, который этот набор должен содержать изначально * @param e4 Другой элемент, который этот набор должен содержать инициально * @throws. <E расширяет enum <e >> enumset <e> of (e e1, e e2, e e3, e4) {enumset <e> result = noneof (e1.getDeclaringClass ()); result.add (e1); result.add (e2); result.add (e3); result.add (e4); результат возврата; } /** * 5 5 элементов коллекции перечисления элементов * * @param e1 Элемент, который этот набор должен содержать изначально * @param e2 Другой элемент, который этот набор должен содержать изначально * @param e3 Другой элемент, который этот набор должен содержать изначально * @param e4. Другой элемент, который этот набор должен содержать инициально * @param e5. Другой элемент, который будет содержать инициально. enum set, изначально содержащий указанные элементы */ public static <e Enum 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); результат возврата; }/** * n * * * @param Сначала элемент, который набор должен содержать изначально * @param, оставляют оставшиеся элементы. Enum <e >> enumset <e> of (e first, e ... rest) {enumset <e> result = noneof (First.getDeclaringClass ()); result.add (первое); для (e e: rest) result.add (e); результат возврата; } /** * перечисленная коллекция элементов в диапазоне * @param из первого элемента в диапазоне * @param к последнему элементу в диапазоне. * диапазон, определяемый двумя указанными конечными точками */ public static <e Enums Enum <e >> enumset <e> range (e от, e to) {if (from.compareto (to)> 0) бросает новый allosalargumentException (от + ">" + to); Enumset <e> result = neOf (from.getDeclaringClass ()); result.addrange (от, до); результат возврата; } /** * Добавляет указанный диапазон в этот набор перечисления, который пуст на предварительном * к вызову. */ Abstract void addrange (e от, e to); /*** Возвращает копию этого набора. * * @return Копия этого набора */ public enumset <e> clone () {try {return (enumset <e>) super.clone (); } catch (clonenotsupportedException e) {бросить новое утверждение иерр (e); }} /*** дополняет содержимое этого набора перечисления. */ Abstract void -комплемент (); /*** бросает исключение, если E не имеет правильного типа для этого набора перечисления. */ final void typecheck (e e) {class eclas = e.getClass (); if (eclass! = elementType && eclass.getSuperClass ()! = elementType) бросить новое classcastException (eclass + "! =" + elementType); } /** * Возвращает все значения, включающие E. * Результат не заменен, кэширован и разделен всеми абонентами. */ private static <E Extends enum <e >> e [] getuniverse (class <e> elementtype) {return sharedsecrets.getJavalangaccess () .getEnumConstantsshared (elementType); } /** * Этот класс используется для сериализации всех экземпляров перечисления, независимо от * типа реализации. Он захватывает их «логическое содержание», и они * реконструируются с использованием общественных статических фабрик. Это необходимо * для обеспечения того, чтобы существование конкретного типа реализации была * детализацией реализации. * * @serial включает * / частный статический класс SerializationProxy <E Enom Enum <e >> реализует java.io.serializable { / ** * Тип элемента этого набора перечисления. * * @serial */ private final Class <e> elementtype; /*** Элементы, содержащиеся в этом наборе перечисления. * * @serial */ private final enum [] elements; Serializationproxy (enumset <e> set) {elementtype = set.elementType; elements = set.toarray (zero_length_enum_array); } private Object readResolve () {enumSet <e> result = enumset.noneof (elementType); для (enum e: elements) result.add ((e) e); результат возврата; } частная статическая конечная длинная последовательность = 362491234563181265L; } Object writeReplace () {return new serializationproxy <> (this); } // Метод ReadObject для шаблона прокси -сервера сериализации // См. Эффективную Java, второе изд., Пункт 78. Private void ReadObject (java.io.objectinputstream) бросает java.io.invalidobjectexception {throw new java.io.invalidobjectexception («Прокси требуется»); }}Суммировать
Выше всего посвящено чтению исходного исходного кода перечисления, и я надеюсь, что он будет полезен для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!