열거
열거는 Java Enum 유형의 일반 컨테이너입니다. Java는 SortedSet, Treeset, Hashset 및 기타 컨테이너를 사용했기 때문에 추가 열거가 필요한 이유 <t>. 답은 열거에 특정 특성이 있다는 것입니다. 예를 들어, 열거는 매우 빠릅니다. 나는 다른 기능을 하나씩 나열하지 않을 것입니다. 결국이 기사의 내용은 열거의 기능을 소개하지 않습니다.
열거 클래스를 위해 특별히 설계된 컬렉션 클래스는 모든 요소가 열거 형이어야합니다.
열거의 세트 요소는 주문되며 비트 벡터가 내부적으로 저장되므로 메모리가 적고 효율성이 높습니다.
널 요소는 허용되지 않습니다
소스 코드
패키지 java.util; import sun.misc.sharedsecrets; public acc / *** 배열을 통해 요소를 저장*/ 최종 ENUM [] 우주; private static enum [] Zero_length_enum_array = new enum [0]; ENUMSET (class <e> elementType, enum [] Universe) {this.ElementType = ElementType; this.universe = 우주; }/** * 빈 열거 세트를 생성하고 요소 유형을 공식화하십시오 * @Param ElementType이 enum * @throws nullpointerexception의 요소 유형의 클래스 객체 <tt> elementType </tt> <e extends enum <e >> enums <e> noneynum (class <e> elementType) {electtype) {electtype) getUniverse (ElementType); if (Universe == NULL) 새로운 ClassCastException을 던지십시오 (ElementType + "Enum이 아님"); if (Universe.length <= 64) 새로운 regularenumset <> (ElementType, Universe)를 반환합니다. 그렇지 않으면 새로운 JumboEnumset <> (ElementType, Universe)를 반환합니다. }/** * 지정된 요소 유형에 모든 요소가 포함 된 열거를 생성 * * @Param ElementType이 enum * set * @throws nullpointerexception의 요소 유형의 클래스 객체 <tt> elementType </tt> IS enum <e >> enums (class <e> elenttype) {elenttype). noneo -of (ElementType); result.addall (); 반환 결과; } /** * 호출 전에 비어있는 적절한 열거 유형 에서이 열거 * 세트에 모든 요소를 추가합니다. */ Abstract void addall (); /** * 지정된 열거 세트와 동일한 요소 유형의 열거 세트를 만듭니다 * @param s이 enum 세트를 초기화하기위한 열거 세트 * @throws nullpointerexception <tt> s </tt> 인 경우 emull */public <e> enums <e> copyof (enumset <e> s) {return s.clone () {return s.clone () {enums (enumset <e>) {enums (enums <e>) {enums (enums <e>) {enums (enums <e>); }/** * <tt> c </tt>가 * <tt> enumset </tt> 인스턴스가 아닌 경우이 열거 세트를 초기화하기 위해 열거 세트를 만듭니다. copyof (collection <e> c) {if (c instanceof enumset) {return ((enumset <e>) c) .Clone (); } else {if (c.isempty ()) Throw New ImperalArgumentException ( "Collection is Vimp"); 반복자 <e> i = C.ITERATOR (); e first = i.next (); 열거 <e> result = enumset.of (첫 번째); while (i.hasnext ()) result.add (i.next ()); 반환 결과; }}/** * <tt> s </tt>가 null */public static <e extends enum <e >> enumset <e> 보완 물 (enumset <e> s) {enumset <e> result = copyf (s); result.complement (); 반환 결과; }/** * 1 요소 열거 컬렉션 * * @param e이 세트가 처음에 * @throws nullpointerexception을 포함하는 요소 <tt> e </tt>가 null * @return이 지정된 요소 */public el enum <e >> enumset <e> of (e) {enumset = e) {enumset = e. noneo- (e.getDeclaringClass ()); result.add (e); 반환 결과; } / ** * 2 요소 열거 컬렉션 * * @param e1이 세트가 처음에 포함하는 요소 * @param e2이 세트가 처음에 포함하는 다른 요소 * @throws nullpointerexception이 포함되어야합니다. enumset <e> result = noneof (e1.getDeclaringClass ()); result.add (e1); result.add (e2); 반환 결과; } / ** * 3 요소 열거 컬렉션 * * @param e1이 세트가 초기에 포함하는 요소 * @param e2이 세트가 처음에 포함하는 또 다른 요소 * @param e3이 세트가 처음에 포함되어야하는 또 다른 요소 * @throws nullpointerexception이 null * @return이 포함 된 경우 volitation <e extatic <e extatic <e extatic <e extatic <e> enum 세트가 포함됩니다. 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 요소 열거 세트 * @param e1이 세트가 처음에 포함하는 요소 * @param e2이 세트가 처음에 포함하는 또 다른 요소 * @param e3이 세트가 처음에 포함하는 또 다른 요소 * @param e4이 세트가 처음에 포함하는 다른 요소 * @throws nullpointerexception이 포함되어야하는 경우 * / ret a reter set a enum set an a anul a a ret an a a ret an a a ret a a annull an a annull an a annull set an a annull set a aformether <e는 Enum <e >> enumset <e> (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); 반환 결과; } /** * 5 요소 열거 컬렉션 * * @param e1이 세트가 처음에 포함하는 요소 * @param e2이 세트가 처음에 포함하는 또 다른 요소 * @param e3이 세트가 처음에 포함하는 또 다른 요소 * @param e4이 세트가 처음에 포함하는 또 다른 요소 * @param e5를 포함하는 것입니다. 처음에 지정된 요소 */ public static <e는 Enum <e >> enumset <e> (e e1, e e2, e e3, e e4, e e result.add (e1); result.add (e2); result.add (e3); result.add (e4); result.add (e5); 반환 결과; }/** * n * * @param 먼저 세트에 초기에 포함하는 요소 * @param rest 세트는 처음에 지정된 요소가 null 인 경우 * @throws nullpointerexception을 포함하는 나머지 요소, * 또는 if <tt> rest </tt>가 초기에 지정된 요소를 포함하는 경우 */@safafavarea -rows <tt> rest an annums */@safavarea -rows <tt> rest </tt>가 포함되어야합니다. enum <e >> enumset <e> of (e first, e ... rest) {enumset <e> result = noneof (first.getDeclaringClass ()); result.add (첫 번째); (e : rest) result.add (e); 반환 결과; } /** * 범위의 첫 번째 요소 * @param 범위의 첫 번째 요소에서 열거 된 요소 모음 * @param 범위에서 마지막 요소까지 {@throws nullpointerexception의 마지막 요소까지 {@code to}가 null * @throws 불법적 인 경우 {@code from.compareto (to) * eleum an all an all all an all an all an all on all on all an all an all an all an all an all an. 두 개의 지정된 엔드 포인트 */ public static <e에 의해 정의 된 * 범위의 요소는 enum <e >> enumset <e> 범위 (e from, e ~) {if (from.compareto (to)> 0) { + ">" + to); enumset <e> result = noneof (from.getDeclaringClass ()); result.addrange (부터); 반환 결과; } /** * 지정된 범위를이 ENUM 세트에 추가합니다. */ Abstract void addRange (e from, e to); /***이 세트의 사본을 반환합니다. * * @return이 세트의 사본 */ public enumset <e> clone () {try {return (enumset <e>) super.clone (); } catch (clonenotsupportedException e) {throw new AssertionError (e); }} /***이 열거 세트의 내용을 보완합니다. */ Abstract void 보완 (); /*** e 가이 열거 세트의 올바른 유형이 아닌 경우 예외를 던집니다. */ final void typecheck (e e) {class eclass = e.getClass (); if (eclass! = ElementType && eclass.getSuperClass ()! = ElementType) 새 ClassCastException (eclass + "! =" + ElementType); } /** * E를 포함하는 모든 값을 반환합니다. * 결과는 모든 발신자가 공유하고 캐시하며 공유합니다. */ private static <e는 enum <e >> e [] getUniverse (class <e> elementType) {return sharedSecrets.getJavalAngaccess () .getEnumConstantSshared (elementType); } /** *이 클래스는 * 구현 유형에 관계없이 모든 열거 인스턴스를 직렬화하는 데 사용됩니다. "논리적 내용"을 포착하고 공개 정적 공장을 사용하여 재구성됩니다. 특정 구현 유형의 존재가 * 구현 세부임을 보장하기 위해 필요합니다. * * @serial 포함 * / private static class SerializationProxy <e 확장 ENUM <e >> java.io.serializable { / ** *이 열거 세트의 요소 유형을 구현합니다. * * * @serial */ private final class <e> elementType; /***이 열거 세트에 포함 된 요소. * * @serial */ private final enum [] 요소; SerializationProxy (Enumset <e> set) {elementtype = set.elementtype; elements = set.toArray (Zero_length_enum_array); } private object readResolve () {enumset <e> result = enumset.noneof (elementType); for (enum e : elements) result.add ((e) e); 반환 결과; } private static final long serialversionuid = 362491234563181265L; } Object WriteReplace () {return new SerializationProxy <> (this); } // 직렬화 프록시 패턴에 대한 readObject 메소드 // 유효 Java, Sec }}요약
위의 것은 열거 된 추상 소스 코드를 읽는 것입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!