この記事の主な研究は、Javaの順序インデックスの代わりに、次のように導入された列挙インデックスの代わりに、列挙の関連するコンテンツです。
学習メモ「Effection Java Chinese Edition2」
多くの場合、Enumの順序メソッドを使用してEnumタイプをインデックス化することがよくあります。
パブリッククラスのハーブ{public enum type {Annual、Perennial、Biennial};プライベート最終文字列名;プライベートファイナルタイプタイプ。ハーブ(文字列名、タイプタイプ){this.name = name; this.type = type; } @Override public String toString(){return name; }}ここで、これらの植物をリストする前に、タイプ(年間、多年生、または隔年)で整理したい庭に植物を表すハーブの配列があるとします。これを行いたい場合は、各タイプに1つずつ3つのセットを構築し、庭全体を繰り返して、各ハーブを対応するセットに入れます。一部のプログラマーは、これらのセットを順序数のタイプによってインデックス付けされた配列に配置することでこれを行います。
// ordinal()を使用して配列をインデックスする-thisherb [] garden = ...; // herb.type.ordinal()set <herb> [] herbsbytype =(set <herb> [])new set [herb.type.values()。長さ]; for(int i = 0; i <herbsbytype.length; i ++){herbsbytype [i] = new hashset <herb>();} for(herbbytype [h.type.ordinal()]。 System.out.printf( "%s:%s%n"、herb.type.values()[i]、herbsbytype [i]);}この方法は確かに実現可能ですが、多くの問題を隠しています。アレイはジェネリックと互換性がないためです。プログラムは、未チェックの変換を実行する必要があり、正しくコンパイルすることはできません。配列はそのインデックスが何を表すかを知らないため、これらのインデックスの出力に手動でラベルを付ける必要があります。しかし、この方法で最も深刻な問題は、列挙順数によってインデックス付けされた配列にアクセスする場合、正しいINT値を使用する責任であることです。 intは酵素にタイプの安全性を提供できません。間違った値を使用する場合、プログラムは間違った作業を静かに完了します。運が良ければ、 ArrayIndexOutofBoundExceptionの例外がスローされます。
java.util.enummapは、列挙に特別に使用される非常に高速なマップ実装です。
// enummapを使用してデータをenump <herb.type、set <herb >> herbsbytype = new enummap <herb.type、set <herb >>(herb.type.class); for(herb.type t:herb.type.values)herbsbytype.put(t、new hashset <herb>()); for(herb h:garden)herbsbytype.get(h.type).add(h); system.out.println(herbsbytype);
このプログラムはより短く、より明確で、より安全であり、序数を使用するプログラムの速度に匹敵する速度で実行できます。危険な変換はありません。マッピングキーは、印刷可能な文字列の列挙に変換する方法を知っているため、これらのインデックスの出力に手動でラベルを付ける必要はありません。また、配列インデックスを計算する際に間違いを犯すことも不可能です。 enummapが走行速度の観点から順序インデックスを介してインデックス化された配列に匹敵する理由は、enumpがこの配列を内部で使用するためです。しかし、それはプログラマーからこの種の思考の詳細を隠し、マップとタイプの安全性の豊富な機能をアレイの速度と組み合わせています。 Enummap Constructorはキータイプクラスオブジェクトを使用していることに注意してください。これは、ランタイムジェネリック情報を提供する限られたタイプトークンです。
要約します
上記は、Javaの序数インデックスコードの代わりに、列挙のすべての詳細な説明です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!