为什么Java不提供对EnumSet和EnumMap的枚举类对象的访问?

时间:2014-08-09 14:49:08

标签: java collections enums enum-map

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

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

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

2 个答案:

答案 0 :(得分:2)

EnumSet的成员类和EnumMap的键类没有getter方法的原因是为了有效地使用这些类,静态类型通常是已知的,程序员使用的类型&{39} 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

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

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

类似的技术可能用于获取EnumMap的密钥类。

答案 1 :(得分:1)

  

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

我想不出技术上的原因。但是,我也无法想到一个需要它的引人注目的用例。

但最终,您的问题的答案是,它是由Java设计者做出的决定,只有他们能够解释决策的实际推理。