Effective Java~36. 用EnumSet 代替位域
如果枚举类型的元素主要用于集合中,一般来说使用 int 枚举模式(条目 34),下面将 2 的不同倍数赋值给每个常量:
// Bit field enumeration constants - OBSOLETE!
public class Text {public static final int STYLE_BOLD = 1 << 0; // 1public static final int STYLE_ITALIC = 1 << 1; // 2public static final int STYLE_UNDERLINE = 1 << 2; // 4public static final int STYLE_STRIKETHROUGH = 1 << 3; // 8// Parameter is bitwise OR of zero or more STYLE_ constantspublic void applyStyles(int styles) { ... }
}
这种表示方式允许你使用按位或(or)运算将几个常量合并到一个称为位属性(bit field)的集合中:
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);
java.util 包提供了 EnumSet 类来有效地表示从单个枚举类型中提取的值集合。 这个类实现了
Set 接口,提供了所有其他 Set 实现的丰富性,类型安全性和互操作性。 但是在内部,每个 EnumSet 都表示为一个位矢量(bit vector)。 如果底层的枚举类型有 64 个或更少的元素,并且大多数情况下,整个 EnumSet 用单个 long 表示,所以它的性能与位属性的性能相当。 批量操作(如 removeAll 和 retainAll )是使用按位算术实现的,就像你为位属性手动操作一样。
// 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 bestpublic void applyStyles(Set<Style> styles) { ... }
}
这里是将 EnumSet 实例传递给 applyStyles 方法的客户端代码。 EnumSet 类提供了一组丰富的静态工厂,可以轻松创建集合,其中一个代码如下所示:
text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
请注意, applyStyles 方法采用Set<Style> 而不是EnumSet<Style> 参数。 尽管所有客户端都可能会将EnumSet 传递给该方法,但接受接口类型而不是实现类型通常是很好的做法(条目 64)。
Effective Java~36. 用EnumSet 代替位域相关推荐
- Effective Java之用EnumSet代替位域(三十二)
什么是位域?为什么用到它? 先来看一个例子: public class Test {public static final byte STYLE_BOLD = 1<<0; // 1publ ...
- Effective Java笔记第五章枚举和注解第三节用EnumSet代替位域
Effective Java笔记第五章枚举和注解 第三节用EnumSet代替位域 在以前如果一个枚举类型的元素主要用在集合中,一般就会使用int枚举模式.比如说: public class Demo ...
- 第 3 次读 Effective Java,这 58 个技巧最值!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:Dong GuoChao <Effective ...
- 读完《Effective Java》后,总结了 50 条开发技巧
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Dong GuoChao 来源 | https ...
- Effective Java读书笔记二:枚举和注解
第30条:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外. 第31条:用实例域代替序数 枚举的ord ...
- 读完 Effective Java,我整理了 59 条技巧!(含pdf)
点击⬆️方"逆锋起笔",公众号回复 编程资源领取大佬们推荐的学习资料 上一篇:CTO 写低级 Bug,致公司 70 GB 数据泄露! 作者:Dong GuoChao 链接:http ...
- Effective Java(第3版) 90条经验法则
目录 第2章 创建和销毁对象 第1条:用静态工厂方法替代构造器 第2条:遇到多个构造器参数时要考虑使用构建器 例子 使用 第3条:用私有构造器或者枚举类型强化Singleton属性 例子 使用 第4条 ...
- 《Effective Java》真的是一本值得一直去钻研的好书
文章目录 <Effective Java>读书笔记 第一章 引言 第二章 创建和销毁对象 1 考虑使用静态工厂方法替代构造方法** 2 当构造方法参数过多时使用builder(建造者) 模 ...
- 《Effective Java》阅读笔记(二)
最近在看<Effective Java>这本书,顺便就记录一些笔记,记录一下书中的一些知识点以及对知识点的总结.一般情况会记录所有的知识点,但是知识点太过简单或者无归纳点总结的就不做详细记 ...
最新文章
- Java 第三周总结
- explorer.exe rundll32.exe病毒解决方案
- mui aniShow 动画属性
- 【概率DP】$P2059$ 卡牌游戏
- Citrix基础端口了解
- 【SQL练习题】case when实现按要求排序
- C++ 类的静态成员变量为什么一定要初始化
- 串口硬盘如何应用于并口硬盘计算机,并口硬盘和串口硬盘的区分与看图学习电脑硬盘的安装...
- MTK平台Camera图片的Exif信息
- 计算机isas测试,SAS硬盘测试:15,000转对决10,000转
- 输出今天是星期几并计算n天后的日期(万年历)
- JS实现二叉树添加节点,删除节点操作
- python量化策略——改进的美林时钟介绍(0)
- proguard.cfg 配置文件
- SIMULIA 官方技术论坛全年时间表新鲜出炉!
- springboot项目启动报错-案例情景介绍
- CGB2111-Day18
- 泰然金融创始人潘宝锋分析网贷行业发展动态
- UE4 安卓打包失败“Build-tool 31.0.0 is missing DX”
- GraalVM编译SpringBoot程序