在现代Java 8 API中使用位域而不是EnumSet的理由

Mar*_*nik 19 java enumset bit-fields java-8

EnumSet,就像enum它自身一样古老(自Java 5开始),应该是比特场的用例的非妥协替代品:像位域一样快速和精简(好吧,除了不是原始类型),以及类型安全的启动.另一方面,最新和多年来最受期待的Java API-Streams API - 毫不掩饰地使用了bitfields Spliterator特性.

我是否应该认为上述内容是核心Java专家的明确承认,EnumSet毕竟不是那么好?我是否应该重新考虑从不使用位域的常见最佳实践建议?

Roh*_*ain 21

相当惊讶地发现它使用的是bitfield而不是EnumSet.在这个邮件列表线程中讨论了理性.似乎原因是能够设置和取消设置各种特性而不影响呼叫者端的特征.使用a EnumSet来实现这一点,EnumSet每当需要在不同阶段更改它时,就需要创建一个新对象.我想这就是为什么比特场在那里赢得比赛的原因.

该主题的结束语主要在此预测您的问题:

Java 8 API中存在这样的标志会(并且应该)引起很多人的关注,因为它违背了十多年来人们所说的话.如果按原样采用,那么对于文档读者来说,最好能够解释为什么替代方案被拒绝."我们对int旗帜很满意,没有其他任何明显更好的建议"它不会削减它."我们知道int标志对于API来说不是很好,但我们很难找到更好的替代品,但无济于事"(如果确实如此).

  • @RohitJain既然你提到了它,让我给你一个相反的例子:ruby.那里的建议是"做任何你喜欢的事情,这里有一个完整的武器库,有趣的想象力的方式射击自己的脚". (3认同)
  • 很好的参考,谢谢!好像我打了一个真正的痛处--- Josh Bloch捍卫他的枚举与Doug Lea C大师:) (2认同)
  • @ingo我肯定想知道Java的创建者是如何使用他们的语言的.如果他们说"使用EnumSet",请放心我会想要使用它. (2认同)