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

2022-09-02 10:21:30

EnumSet,与它本身一样古老(都是从Java 5开始),应该是bitfield用例的非妥协替代品:与bitfield一样快速和精益(好吧,除了不是原始类型),并且类型安全启动。另一方面,最近和多年来最受期待的Java API——Streams API——毫不羞愧地使用比特字段来表示特征enumSpliterator

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


答案 1

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

该线程的最后一句话基本上预示着您在这里的问题:

在Java 8 API中出现这样的标志将(并且应该)引起很多关注,因为它与人们十多年来一直被告知的内容背道而驰。如果它按原样被采用,最好为文档读者提供一个很好的解释,说明为什么替代方案被拒绝。“我们对int标志感到满意,没有其他更好的建议”不会削减它。“我们知道int标志对于API来说不是很好,但我们非常努力地寻找更好的替代方案,但无济于事”(如果这是真的)。


答案 2

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

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


推荐