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

EnumSet ,与enum本身一样古老(自Java 5开始),应该是位域用例的非妥协替代品:与位域一样快速和精简(好吧,除了不是原始类型),以及类型安全开机 另一方面,最新和多年来最受期待的Java API-Streams API – Spliterator地为Spliterator的特性使用了位域。

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

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

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

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

我是否应该重新考虑从不使用位域的常见最佳实践建议?

是。 您通常应该重新考虑任何包含“始终”或“从不”字样的建议,无论它是“常见”还是不常见。