在现代Java 8 API中使用位域代替EnumSet的理由
问题内容:
EnumSet
,enum
它本身就古老(自Java
5起),被认为是对位域用例的不妥协的替代:与位域一样快和精简(很好,除了不是原始类型),并且类型安全启动。在另一方面,最近,多年来最值得期待的Java
API,该API流,底气十足地采用对位域Spliterator
的特性。
我是否应该将上述内容视为Java核心专家的明确认可,EnumSet
毕竟那还不是那么好?我是否应该重新考虑不使用位域的常见最佳实践建议?
问题答案:
惊讶地发现它正在使用位域而不是EnumSet
。虽然合理,但在此邮件列表线程中进行了讨论。似乎原因是能够设置和取消设置各种特征而不会影响呼叫者端的特征。使用EnumSet
,要实现这一点,EnumSet
每次需要在不同阶段进行更改时,都需要创建一个新对象。我想这就是位域赢得比赛的原因。
该线程的结论句基本上在这里预料到您的问题:
Java 8
API中此类标志的存在将(并且应该)引起很多人的注意,因为它违背了人们十年来一直被告知的内容。如果按原样采用,那么对于文档阅读者来说,最好是对为什么拒绝替代品有一个很好的解释。“我们对int标志感到满意,并且没有其他任何可以更好地表明自身的东西了”。“我们知道int标志对于API而言不是很好,但是我们非常努力地寻找了更好的替代方法,但没有成功”(如果是真的)。