-1

EnumSet具有值类的私有字段。为什么不提供公共访问?

此外,EnumMap具有键和值类的私有字段。同样的问题。

对于非空集/映射,可以迭代第一个元素并从非空值中提取类。但是,对于空集/映射,这是不可能的。

4

2 回答 2

2

EnumSetan的成员类和关键类没有getter方法的原因是EnumMap为了有效地使用这些类,静态类型通常是程序员已知和使用的,并且类型Class可以很容易地派生自使用类文字的类型名称。

例如,考虑以下枚举:

enum Direction { NORTH, EAST, SOUTH, WEST }

你会这样使用它:

Set<Direction> wittsEnd = EnumSet.of(NORTH, EAST, SOUTH); // hint: don't go west

要添加、删除或检查此集合中的成员资格,我们通常有一个Direction实例。如果我们想创建一个新集合或从现有集合派生一个,我们将声明一个类型为 的变量Set<Direction>。如果我们想要Class枚举类型对应的对象,我们只需使用Direction.class. 因此,通常不需要将Class对象从EnumSet自身中取出。

类似的推理适用于EnumMap

我想可能存在一些情况,其中一个人有一个 an 的实例,EnumSet<?>并且您想要创建一组所有或没有枚举值,这需要Class编译时未知类型的对象。这样的情况似乎很做作。但是,对于这种情况,可以使用这种同样人为的技术(即 hack)来获取某些未知 EnumSet 的枚举类s

Class<? extends Enum<?>> enumClass =
    EnumSet.copyOf(s).addAll(EnumSet.complementOf(s)).iterator().next().getClass();

类似的技术可能用于获取EnumMap.

于 2014-08-10T02:49:38.333 回答
1

EnumSet 有一个值类的私有字段。为什么不提供公共访问?

我想不出技术上的理由不这样做。但是,我也想不出一个需要它的引人注目的用例。

但最终,您的问题的答案是,这是由 Java 设计人员做出的决定,只有他们才能解释这些决定的实际推理。

于 2014-08-09T14:58:19.990 回答