如果查找键是String,则为EnumMap或HashMap

dog*_*ane 29 java collections hashmap enum-map

我正试图权衡使用EnumMapa的优缺点HashMap.因为,我将一直在寻找使用a 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

假设AnimalType枚举和地图仅用于AnimalFactory创建动物而不是其他任何地方.

Map我应该使用哪个?

Pet*_*rey 13

如果可以枚举所有有效密钥,我会使用它,因为它可以确保您始终使用有效值.

它还可以避免混淆,因为String可以用于很多事情,并且很容易将"Animal"字符串转换为用于其他内容的字符串.由于枚举类型通常不能与其他类型互换(除非您使用通用接口),编码错误的可能性较小.