Java中EnumSet代替位域代码详解
本文研究的主要是Java中EnumSet代替位域的相关内容,具体介绍如下。
位域表示法允许利用位操作,有效地执行先 union(联合)和 intersection(交集)这样的集合操作。但是位域有着int枚举常亮的所有缺点,甚至更多。当位域一数字形式打印时,翻译位域比翻译简单的int枚举常量要困难得多。甚至,要遍历位域表示的所有元素都没有很容易的方法。
//Bit field enumeration constant - OBSOLETE public class Test { public static final byte STYLE_BOLD = 1<<0; // 1 public static final byte STYLE_ITALIC = 1<<1; // 2 public static final byte STYLE_UNDERLINE = 1<<2; // 4 public static final byte STYLE_STRIKETHROUGH = 1<<3; // 6 //Parameter is bitwise OR of zero or more STYLE_ constants public void applyStyles(int styles) { ... } }
java.util 包提供了EnumSet类来有效地表示从单个枚举类型中提取的多个值的多个集合。这个类实现Set接口,提供了丰富的功能,类型安全性,以及可以从任何其他Set实现中得到的互用性。但是在内部具体的实现上,每个EnumSet内容都表示为位矢量。如果底层的枚举类型有64个或者更少的元素――大多数如此。整个EnumSet就用单个long来表示,因此它的性能比的上位域的性能。批处理,如removeAll和retainAll,都是利用位算法来实现的。就像手工替代位域实现得那样。但是可以避免手工操作时容易出现的错误以及不太雅观的代码,因为EnumSet替你完成了这项艰巨的工作。`
//EnumSet - a modern replacement for bit fields public class Text { public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }; //Any Set could be passed in, but EnumSet is clearly best public void applyStyles(Set<Style> styles) { System.out.println(styles); } public voidtest(){ applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC)); } }
执行
test(),输出
[BOLD, ITALIC]。
EnumSet 类集位域的简洁和性能优势及枚举类型的所有优点于一身,所以我们没有理由再使用位域表示法。除非是组成通信协议字段。
但实际上EnumSet也有一个缺点――它无法创建不可变的EnumSet,但我们可以用Collections.unmodifiableSet将EnumSet封装起来,但是简洁性和性能都会受到影响。
public voidtest(){ EnumSet<Style> styles = EnumSet.of(Style.BOLD, Style.ITALIC); Set<Style> unmodifiableStyle = Collections.unmodifiableSet(styles); unmodifiableStyle.add(Style.UNDERLINE); }
这样如果往 unmodifiableSet 中添加元素就会报 java.lang.UnsupportedOperationException
总结
以上就是本文关于Java中EnumSet代替位域代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
您可能感兴趣的文章:
- C语言 位域详解及示例代码
- Java中EnumMap代替序数索引代码详解
- 上传图片到服务器中的代码(并把图片的名字用当前时间来代替)
- java中volatile和transient关键字详解附代码示例
- 四个范围代码详解
- [转] Console命令详解,让调试js代码变得更简单
- PCA 降维算法详解 以及代码示例
- STM32CubeMX移植机智云自动生成代码详解
- python操作列表的函数使用代码详解
- modelsim中代码覆盖率使用详解
- stl map底层之红黑树插入步骤详解与代码实现
- php 的反射详解及示例代码
- 微信小程序 progress组件详解及实例代码
- HTTP Response Status Code -- HTTP响应代码中文详解
- 动作编辑器(Cocos2dx)制作流程详解及附上响应鼠标滚轴事件、反转坐标系、导入/创建资源目录等知识点代码!
- AJAX请求和响应代码详解
- Android中如何实现代码混淆详解
- 算法代码[置顶] 机器学习实战之KNN算法详解
- Spring Boot使用过滤器和拦截器分别实现REST接口简易安全认证示例代码详解
- SA + Height 代码详解