JavaのEnumMapは、プロローグインデックスコードの代わりに詳しく説明します。


本研究の主な内容はJavaのEnumMapが序数インデックスに代わるものであり、具体的には以下の通りである。
学習ノート「Effective Java中国語版第2版」
エムのordinalメソッドを使ってエニュメレート・タイプを索引することがよくあります。

public class Herb {
  public enum Type { ANNUAL, PERENNIAL, BIENNIAL };
  private final String name;
  private final Type type;

  Herb(String name, Type type) {
    this.name = name;
    this.type = type;
  }

  @Override public String toString() {
    return name;
  }
}
今はハーブの配列があると仮定して、庭の植物を表しています。タイプ(一年生、多年生または二年生植物)によって組織してからこれらの植物を並べたいです。このようにするには、3つの集合を構築し、それぞれのタイプを一つずつ庭全体を巡回し、それぞれのハーブをセットに入れる必要があります。いくつかのプログラマは、これらのセットをタイプの順序に従ってインデックスする配列に配置して実現します。

//Using ordinal() to index an array - DON'T DO THIS
Herb[] garden = ... ;

//Indexed by Herb.Type.ordinal()
Set<Herb>[] herbsByType = (Set<Herb>[])new Set[Herb.Type.values().length]; 
for(int i=0; i<herbsByType.length; i++) {
  herbsByType[i] = new HashSet<Herb>();
}

for(Herb h : garden) {
  herbsByType[h.type.ordinal()].add(h);
}

//Print the results
for(int i=0; i<herbsByType.length; i++) {
  System.out.printf("%s: %s%n", Herb.Type.values()[i], herbsByType[i]);
}
この方法は確かに可能ですが、多くの問題が隠れています。配列は汎型と互換性がないからです。プログラムは未検査の変換が必要で、正確にコンパイルすることができません。配列はインデックスが何を表しているか分かりませんので、これらのインデックスの出力を手動で表示しなければなりません。しかし、この方法の最も深刻な問題は、列挙の順序に従ってインデックスを作成する配列にアクセスする時に、正しいint値を使うのがあなたの役目です。int列挙されたタイプのセキュリティは提供できません。間違った値を使うと、プログラムが静かにエラーの作業を完了したり、幸運があればアラーIndexOutOfBoundExceptionを投げます。
java.util.EnumMapは、エニュメレート・キーのための非常に高速なMap実装です。

//Using an EnumMap to associate data with an enum
Map<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が運転速度において、プロローグインデックスを通る配列に匹敵するのは、EnumMapが内部でこの配列を使用しているからです。しかし、プログラマにはこのような考えの詳細が隠されています。Mapの豊富な機能とタイプの安全と配列の迅速さが揃っています。EnumMapコンストラクタはキータイプのクラスオブジェクトを採用しています。これは実行時の一般情報を提供する限定型トークンです。
締め括りをつける
以上はJavaのEnumMapが、プロローグの代わりにインデックスコードを詳細に解説した内容の全部です。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。