I\'m trying to weigh the pros and cons of using an EnumMap
over a HashMap
. Since, I will always be looking up using a String
, it seems tha
First of all, all you keys are final immutable. You should definitely use EnumMap
.
This is like Hash in Ruby:
options = { :font_size => 10, :font_family => "Arial" }
:font_size
is the symbol in Ruby, the final static counterpart in Java.
If all valid keys can be enumerated, I would use that as it ensures you are always working with a valid value.
It can also avoid confusion as String can be used for lots of things and is easy to turn an "Animal" string into a string used for something else. As enum types are not interchangable with other types in general (unless you use a common interface), there is less chance of error in coding.
If the set of possible keys is finite and known in advance (as your example/question suggest), then the enum is a perfect representation of this. As other said, the use of an enum ensures that no mistake will be made in the use of the key.
Furthermore, this implementation of Map is quite optimized, as the range of the keys is known in advance (as far as I knwow, the EnumMap uses an array of length numberOfEnums internally, indexed by the enum's ordinal).
So I would also recommend EnumMap
.
Two (little) things to keep in mind though :
Key Of Map should be unmodifiable and Unique and this can be guranteed using Enum.
Also managing it would be easier and less error prone as compare to managing String.
So Go For EnumMap.
Also as we have advanced enums, we can attach many other information and operations with the keys itself.
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;
}
}