我最近一直在阅读 Java。所以我在下面有一个枚举,它作为一个带有键“JESSIE”和值“我最喜欢的猫”的地图。
那么为什么有人需要使用 EnumMap 呢?谢谢
public enum Cat {
JESSIE("My favorite cat");
private String description;
Cat(String description){
this.description = description;
}
}
enum
是 中的关键,因此EnumMap
这两件事是完全不同的。您无法知道您可能想与您的猫相关联的所有类型的事情。
可能是的description
固有部分Cat
,但您可能希望将猫与它们的仆人联系起来,或者它们(当前)居住的地方或它们(当前)喜欢的食物是什么。
EnumMap<Cat, Human> catsServant;
EnumMap<Cat, House> catsHome;
EnumMap<Cat, Meal> catsFood;
由于您不需要修改Cat
以将其与另一个对象关联,因此它更易于使用,并且如果您将所有可能的东西填充到您的枚举中,您可能希望将其与猫关联起来,那么您的枚举将变得巨大。
第二个问题是enum
s 是单例,这意味着如果您通过添加方法将可变状态(强烈反对!)放入您的方法中,它将在您的程序中全局更改。这对于简单的程序或简单的属性(如Cat
setDescription(String)
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>
.
这背后的主要原因是以这样一种方式设计类,即它包含代表其实体的属性,而不是在查询时需要映射的属性。
例如,考虑另一个类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"));