本文研究的主要是Java中EnumSet代替位域的相关内容,具体介绍如下。
读书笔记《Effective Java 中文版 第2版》
位域表示法允许利用位操作,有效地执行先 union(联合)和 intersection(交集)这样的集合操作。但是位域有着int枚举常亮的所有缺点,甚至更多。当位域一数字形式打印时,翻译位域比翻译简单的int枚举常量要困难得多。甚至,要遍历位域表示的所有元素都没有很容易的方法。
|
1
2
3
4
5
6
7
8
9
10
|
//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替你完成了这项艰巨的工作。`
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//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 void test() {
applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
}
}
|
执行 test() ,输出 [BOLD, ITALIC] 。
EnumSet 类集位域的简洁和性能优势及枚举类型的所有优点于一身,所以我们没有理由再使用位域表示法。除非是组成通信协议字段。
但实际上EnumSet也有一个缺点——它无法创建不可变的EnumSet,但我们可以用Collections.unmodifiableSet将EnumSet封装起来,但是简洁性和性能都会受到影响。
|
1
2
3
4
5
|
public void test() {
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代替位域代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://blog.csdn.net/chy555chy/article/details/53764060
相关文章
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
- ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-27 91
-
2025-05-25 38
-
2025-06-04 78
-
新手建站技术选型:Windows和Linux系统的社区支持与资源获取
2025-06-04 59 -
2025-05-29 24

