EnumSet
有一个值类的私有字段。为什么不提供公共访问?
此外,EnumMap
具有键和值类的私有字段。同样的问题。
对于非空集/映射,可以迭代第一个元素并从非空值中提取类。但是,对于空集/映射,这是不可能的。
答案 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设计者做出的决定,只有他们能够解释决策的实际推理。