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

标签 java java-8 bit-fields enumset

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

我是否应该将以上内容视为核心 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/

相关文章:

java - 隐藏接口(interface)的默认方法

c - 初始化位域

java - IntelliJ - 如何从 "Run" View 中的失败单元测试跳转到源代码而不是编译类

java - Activity_splash 无法解析或者它不是 Android 应用程序中的字段

Java:如何通过列名检索SQL结果集数据?

带状态的 Java Streams - 一个简单的练习

java - 如何在 Mac 上安装 Java 8

java - Mockito 测试抛出异常的 void 方法。 Spring Boot,eclipse IDE

c++ - 位域的完美转发解决方法

c - 在C中设置位域