1

我最近一直在阅读 Java。所以我在下面有一个枚举,它作为一个带有键“JESSIE”和值“我最喜欢的猫”的地图。

那么为什么有人需要使用 EnumMap 呢?谢谢

public enum Cat {
    JESSIE("My favorite cat");

    private String description;

    Cat(String description){
        this.description = description;
    }
}
4

2 回答 2

3

enum是 中的关键因此EnumMap这两件事是完全不同的。您无法知道您可能想与您的猫相关联的所有类型的事情。

可能是的description固有部分Cat,但您可能希望将猫与它们的仆人联系起来,或者它们(当前)居住的地方或它们(当前)喜欢的食物是什么。

EnumMap<Cat, Human> catsServant;
EnumMap<Cat, House> catsHome;
EnumMap<Cat, Meal> catsFood;

由于您不需要修改Cat以将其与另一个对象关联,因此它更易于使用,并且如果您将所有可能的东西填充到您的枚举中,您可能希望将其与猫关联起来,那么您的枚举将变得巨大。

第二个问题是enums 是单例,这意味着如果您通过添加方法将可变状态(强烈反对!)放入您的方法中,它将在您的程序中全局更改。这对于简单的程序或简单的属性(如CatsetDescription(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>.

于 2020-03-28T17:56:45.607 回答
2

这背后的主要原因是以这样一种方式设计类,即它包含代表其实体的属性,而不是在查询时需要映射的属性。

例如,考虑另一个类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"));
于 2020-03-28T17:42:21.783 回答