20

EnumSet,和它本身一样古老enum(都是从 Java 5 开始的),应该是位域用例的不折不扣的替代品:与位域一样快速和精简(好吧,除了不是原始类型),并且类型安全引导. 另一方面,最近和多年来最受期待的 Java API——Streams API——毫不掩饰地使用位域Spliterator表示.

我是否应该将以上内容视为核心 Java 专家的明确承认,EnumSet毕竟这并不好?我是否应该重新考虑永远不要使用位域的常见最佳实践建议?

4

2 回答 2

24

看到它使用的是位域而不是EnumSet. 虽然在这个邮件列表线程中讨论了理性。似乎原因是能够设置和取消设置各种特性而不影响调用方的特性。使用, 要实现这一点,每次需要在不同阶段更改它时EnumSet,都需要创建一个新对象。EnumSet我想这就是位字段在那里赢得比赛的原因。

该线程的结束语基本上预测了您的问题:

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

于 2014-03-23T20:35:00.950 回答
-2

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

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

于 2014-03-23T20:24:33.533 回答