[英]Java - Why use EnumMap when enum itself can be used as a map?
我最近一直在阅读 Java。 所以我在下面有一个枚举,它充当带有键“JESSIE”和值“我最喜欢的猫”的地图。
那么为什么有人需要使用 EnumMap 呢? 谢谢
public enum Cat {
JESSIE("My favorite cat");
private String description;
Cat(String description){
this.description = description;
}
}
这背后的主要原因是以这样一种方式设计类,即它拥有代表其实体的属性,而不是在查询时需要映射的属性。
例如,考虑另一个类Human
,如下所示
@AllArgsConstructor
static class Human {
String name;
}
现在,您可以查找Cat
到其所有者的映射,但是为这样的映射保留整个Human
对象的引用有多大意义? 尽管事实上,您可以保留这样的引用,但在这种情况下,对查询能力有帮助的是将这样的引用保留在附加数据结构EnumMap
中 -
EnumMap<Cat, Human> enumMap = new EnumMap<>(Cat.class);
enumMap.put(Cat.JESSIE, new Human("naman"));
enumMap.put(Cat.LUCY, new Human("user"));
enum
是EnumMap
的关键,因此这两件事是完全不同的。 您无法了解您可能想与您的猫联系在一起的所有事物。
description
可能是Cat
的固有部分,但您可能希望将猫与它们的仆人、它们(当前)住在哪里或它们(当前)喜欢的食物联系起来。
EnumMap<Cat, Human> catsServant;
EnumMap<Cat, House> catsHome;
EnumMap<Cat, Meal> catsFood;
由于您不需要修改Cat
以将其与另一个对象相关联,因此它更易于使用,并且如果您将所有可能想要与您的猫相关联的东西填充它,您的枚举将变得很大。
第二个问题是enum
是单例,这意味着如果您要通过添加setDescription(String)
方法将可变状态(强烈不鼓励!)放入Cat
,它将在您的程序中全局更改。 对于简单的程序或像description
这样的简单属性,这可能无关紧要,但是当您拥有更复杂的代码时,这很重要。
现在是一个更现实的例子。 JDK TimeUnit
枚举具有诸如MINUTE
值,并且创建者不可能知道人们可能想要与它们关联的所有可能事物。 但是,使用EnumMap
我可以提供我的母语的翻译,如下所示:
EnumMap<TimeUnit, String> xlate = new EnumMap<>(TimeUnit.class);
xlate.put(TimeUnit.MINUTE, "Minuutti");
xlate.put(TimeUnit.SECOND, "Sekunti");
TimeUnit
不是我的课程,所以我无法编辑它以包含这些翻译,无论如何它都是错误的地方。
一个相关的问题是为什么有一个特殊的EnumMap
,因为您也可以使用法线贴图,例如HashMap<Cat, Human>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.