eNumset
Enumsetは、Java Enumタイプの一般的なコンテナです。 Javaには並べ替え、ツリーセット、ハッシュセット、その他のコンテナが並べ替えられているため、なぜ追加の列挙<t>が必要なのですか?答えは、Enumsetには特定の特性があるということです。たとえば、Enumsetは非常に高速です。結局のところ、この記事のコンテンツでは、Enumsetの機能を紹介していません。
列挙クラス専用に設計されたコレクションクラス、すべての要素は列挙タイプでなければなりません
列挙設定の設定要素は順序付けられ、ビットベクトルによって内部に保存されるため、メモリが少なくなり、効率が高くなります。
ヌル要素は許可されていません
ソースコード
パッケージjava.util; import sun.misc.sharedsecrets; public abstract class enumset <e ends enums <e >> extends abstractset <e>はクローン可能、java.io.io.serializable { / *** element type* / 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; }/** *空の列挙セットを作成し、その要素タイプ * @param elementTypeこのenumの要素タイプのクラスオブジェクト * set * @throws nullpointerexception if <tt> elementtype </tt>はnull */public static <e extends enum <e >> enumset <e> noneof(<e> e> ementtype) getuniverse(elementType); if(Universe == null)新しいclasscastException(elementType + "NOT ANUM"); if(universe.length <= 64)return new remolalEnumset <>(elementType、Universe);それ以外の場合は、new JumboEnumset <>(ElementType、Universe)を返します。 }/** *指定された要素タイプのすべての要素を含む列挙を作成します。 * * @param elementTypeこのenumの要素タイプのクラスオブジェクト * set * @throws nullpointerexception if <tt> elementtype </tt> is null */public static <e ends enumset noneof(elementType); result.addall();返品結果; } /** *適切な列挙タイプからこのenum *セットにすべての要素を追加します。これは、コールの前に空です。 */ abstract void addall(); /** *指定された列挙型と同じ要素タイプの列挙セットを作成します * * @param sこの列挙セットを初期化するenumセット}/** *このenumセットを作成します。このenumセットを作成します。 * @thtt> c </tt>が * <tt> enumset </tt>インスタンスではなく、要素が含まれておらず、@throws nullpointerexceptionが含まれていない場合 * @throws nullpointerexceptionが含まれていません。 copyof(collection <e> c){if(c instanceof enumset){return((enumset <e>)c).clone(); } else {if(c.isempty())新しいIllegalargumentException( "Collection Is veatt"); iterator <e> i = c.iterator(); e first = i.next(); enumset <e> result = enumset.of(first); while(i.hasnext())result.add(i.next());返品結果; }}/** *このenumを初期化するための補数からenumセットを作成します。 result.complement();返品結果; }/** * 1要素列挙コレクション * * @param eこのセットが最初に含めることである要素<tt> e </tt>がnull * @return an enum an and ans ans and extified static <e extends enumset <e> of(e){numset <e> noneof(e.getdeclaringclass()); result.add(e);返品結果; } / ** * 2要素列挙コレクション * * @param E1このセットが最初に含めることである要素 * @param e2このセットは最初に含めることです * @throws nullpointerexception * @returnがnull * @return and and ans ans and and and and and and cimberticified elements * / public static <e extens <e e> enumset <e> result = noneof(e1.getDeclaringClass()); result.add(e1); result.add(e2);返品結果; } / ** * 3要素列挙コレクション * * @param e1このセットが最初に含めることである要素 * @param e2このセットは最初に含む別の要素 * @param e3このセットは最初に含む別の要素です * @throws nullpointerexceptionがnull * @return an enum an enums enumseciativativitiativativatives enms exped <e of(e1、e 2、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は最初に含まれる別の要素ですenums <e >> enumset <e> of(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 e5の別の要素 * @param nulpurnpurnpers nullpurnecturn指定された要素 */ public static <e ends enums <e >> enumset <e> of(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 rets retsを残した要素を最初に含めることです。 enumset <e> of(e first、e ... rest){enumset <e> result = noneof(first.getDeclaringClass()); result.add(first); (e e:ret)result.add(e);返品結果; } /** *範囲内の要素のコレクション * @param範囲の最初の要素から * @paramの範囲の最後の要素へ * @throws nullpointerexceptionの場合、 @コードfrom}または{@code to}がnull * @throws Illegalargumentexception if if {comparetoからint inturn 0 @set> from perpern a end> *指定された2つのエンドポイントで定義された範囲 */ public static <e ends enum <e >> enumset <e>範囲(e from、eから){if(from.compareto(to)> 0)新しいIllegalargumentexception( + ">" + to); enumset <e> result = noneof(from.getDeclaringClass()); result.addrange(from、to);返品結果; } /** *この列挙セットに指定された範囲を追加します。 */ abstract void addrange(e from、e to); /***このセットのコピーを返します。 * * @returnこのセットのコピー */ public enumset <e> clone(){try {return(enumset <e>)super.clone(); } catch(clonenotsupportedexception e){新しいAssertionError(e); }} /***この列挙セットの内容を補完します。 */ abstract void comproment(); /*** Eがこの列挙セットの正しいタイプでない場合、例外をスローします。 */ final void typecheck(e e){class eclass = e.getclass(); if(eclass!= elementType && eclass.getSuperClass()!= elementType)Throw New ClassCastException(Eclass + "!=" + elementType); } /** * E. *を含むすべての値を返します。結果は、すべての発信者によって除外、キャッシュ、共有されます。 */ private static <e Extends enum <e >> e [] getuniverse(class <e> elementType){return sharedsecrets.getJavalangaccess().getEnumConstantsShared(elementType); } /** *このクラスは、実装タイプに関係なく、すべての列挙インスタンスをシリアル化するために使用されます。それは彼らの「論理コンテンツ」をキャプチャし、それらは *公共の静的工場を使用して再構築されます。これは、特定の実装タイプの存在が *実装の詳細であることを確認するために必要です。 * * @serial include * / private static class serializationproxy <e extends enum <e >> java.io.serializable { / ** *この列挙セットの要素タイプ。 * * @serial */ private final class <e> elementType; /***この列挙セットに含まれる要素。 * * @serial */ private final enum []要素。 SerializationProxy(enumset <e> set){elementType = set.ElementType;要素= 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、2番目のed。、項目78を参照してください。 }}要約します
上記は、Enumset Abstract Sourceコードを読むことに関するものであり、すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!