EnumMap
よりもHashMap
を使用する場合の長所と短所を比較検討しています。私は常にString
を使用して検索するので、HashMap
キーを持つString
が正しい選択のようです。ただし、EnumMap
は、キーを特定の列挙に制限するという私の意図を伝えるので、より良いデザインのように見えます。考え?
以下は、私がMap
をどのように使用するかを示す、信じられない例です:
enum AnimalType { CAT, DOG }
interface Animal {}
class Cat implements Animal {}
class Dog implements Animal {}
public class AnimalFactory {
private static final Map<AnimalType, Animal> enumMap
= new EnumMap<AnimalType, Animal>(AnimalType.class);
// versus
private static final Map<String, Animal> stringMap
= new HashMap<String, Animal>();
static {
enumMap.put(AnimalType.CAT, new Cat());
enumMap.put(AnimalType.DOG, new Dog());
stringMap.put("CAT", new Cat());
stringMap.put("DOG", new Dog());
}
public static Animal create(String type) {
Animal result = enumMap.get(AnimalType.valueOf(type));
Animal result2 = stringMap.get(type);
return result;
}
}
AnimalType
列挙型とマップは、AnimalFactory
が動物を作成するためにのみ使用し、他の場所には使用しないと仮定します。
どのMap
を使用すればよいですか?
すべての有効なキーを列挙できる場合は、常に有効な値を使用して作業していることを確認できるので、それを使用します。
また、Stringは多くのものに使用でき、「動物」の文字列を他の何かに使用される文字列に簡単に変換できるため、混乱を避けることができます。列挙型は一般に他の型と互換性がないため(共通のインターフェイスを使用しない限り)、コーディングでエラーが発生する可能性は低くなります。
可能なキーのセットが有限であり、事前にわかっている場合(例/質問が示唆するとおり)、列挙型はこれを完全に表現したものです。他の人が言ったように、列挙型を使用すると、キーの使用に間違いがないことが保証されます。
さらに、キーの範囲は事前にわかっているため、このMapの実装は非常に最適化されています(私が知っている限り、EnumMapは長さの配列を使用しますnumberOfEnums内部的には、列挙型の序数によって索引が付けられます)。
したがって、私はEnumMap
もお勧めします。
ただし、次の2つの点に注意してください。
Key Of Mapは変更不可で一意でなければならず、これはEnumを使用して保証できます。
また、文字列を管理するよりも管理が簡単で、エラーが発生しにくくなります。
EnumMapに移行します。
また、列挙型が進んでいるため、キー自体に他の多くの情報や操作を添付できます。
enum AnimalType {
Dog("I am dog and I hate cats", true),
CAT("I am cat and I love to eat rats", true),
RAT("I am a mouse and I love tearing human cloths apart", false) ;
private final String description;
private final boolean isHelpFullToHuman;
private AnimalType(String description , boolean isHelpFullToHuman) {
this.description = description;
this.isHelpFullToHuman = isHelpFullToHuman;
}
public boolean isHelpFullToHuman() {
return isHelpFullToHuman;
}
public String getDescription() {
return description;
}
}
まず第一に、すべてのキーは最終的に不変です。必ずEnumMap
を使用してください。
これはRubyのハッシュに似ています。
options = { :font_size => 10, :font_family => "Arial" }
:font_size
は、Javaの最後の静的な対応物であるRubyのシンボルです。