EnumSet
,与 enum
本身一样古老(都是从 Java 5 开始),应该是位域用例的不折不扣的替代品:既快又精简作为位域(好吧,除了不是原始类型),并且可以安全引导。另一方面,最近和多年来最受期待的 Java API — Streams API — 毫不掩饰地为 Spliterator
的 characteristics 使用位域。 .
我是否应该将以上内容视为核心 Java 专家明确承认 EnumSet
毕竟不是那么好?我是否应该重新考虑永远不要使用位域的常见最佳实践建议?
最佳答案
很惊讶地看到它使用的是位域而不是 EnumSet
。理性在 this mailing list thread. 中讨论。似乎原因是能够设置和取消设置各种特性而不影响调用方的特性。使用 EnumSet
,要实现这一点,每次需要在不同阶段更改它时,都需要创建一个新的 EnumSet
对象。我想这就是位域在那里赢得比赛的原因。
该线程的结论基本上预测了您的问题:
The presence of such flags in a Java 8 API would (and should) raise a lot of eyebrows, because it goes against what people have been told for well over a decade. If it's adopted as is, there had better be a good explanation for doc readers of why alternatives were rejected. "We were comfortable with int flags and nothing else significantly better suggested itself" won't cut it. "We know int flags aren't great for an API, but we tried very hard to find better alternatives, to no avail" would (if it were true).
关于java - 在现代 Java 8 API 中使用位域而不是 EnumSet 的理由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22596495/