EnumMap 和 EnumSet 是不可导航的,这有什么原因吗?

2022-09-01 06:50:14

枚举是可比较的,这意味着你可以有

NavigableSet<AccessMode> modes = new TreeSet<>();
NavigableMap<AccessMode, Object> modeMap = new TreeMap<>();

这些具有O(ln N)访问时间。

枚举集合具有 O(1) 访问时间,但不可导航

NavigableSet<AccessMode> modes = EnumSet.noneOf(AccessMode.class); // doesn't compile
NavigableMap<AccessMode, Object> modeMap = new EnumMap<>(AccessMode.class);  // doesn't compile

我想知道Enum集合不可导航(和排序)是否有原因。即我错过了什么吗?


答案 1

JDK 及其各种 API 中缺少许多“明显”的功能。为什么省略/忘记了这个特定功能?我们只能猜测。但是您的问题长期以来一直是Sun/Oracle的RFE:

您可以通过注释来支持这些 RFE。请注意,这是Joshua Bloch关于这个主题的权威答案:

我依稀记得考虑过它,但我不记得我们是否有充分的理由明确拒绝了它。当我实现EnumSet和EnumMap时,我们的时间非常短,而且时间可能在我们的决策中发挥了作用。

http://comments.gmane.org/gmane.comp.java.jsr.166-concurrency/2158

所以即使不得不猜测:-)


答案 2

我最好的猜测是,可导航性不被视为枚举集的主要用例。实现中没有任何内容会阻止可导航性。将一组枚举成员的需求与可导航性相结合的罕见用例由 和 介绍。TreeSetTreeMap