是否有任何原因EnumMap和EnumSet不可导航

时间:2012-07-17 11:18:08

标签: java collections enums

Enum是可比较的,这意味着你可以拥有

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

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

Enum集合具有O(1)访问时间,但不是Navigable

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

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

3 个答案:

答案 0 :(得分:38)

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

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

  我模糊地回忆起考虑它,但我不记得是否我们   明确拒绝了它有充分理由。我们跑得很低   我实现EnumSet和EnumMap的时候,有可能   时间在我们的决定中发挥了作用

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

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

答案 1 :(得分:9)

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

答案 2 :(得分:2)

这篇文章没有直接回答这个问题,也没有直接回答这个问题,它只是传达了为什么会引入Navigable

按照我的要求发帖(评论太长了)

  

简短的回答是Navigable存在是因为我们没有   任何像即将到来的“防守者” - 排序并没有描述所有的   常见功能,除了以外没有办法这样做   介绍一个新的界面。在实践中,我确信“Sorted”仍然存在   比“Navigable”更常用作声明类型,因为   大多数人不需要Navigable中定义的方法,但不需要   排序。加上“Navigable”并不是一个非常好的名字: - )

     

-Doug