如果枚举类型的元素主要用于集合中,一般来说使用 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 代替位域相关推荐

  1. Effective Java之用EnumSet代替位域(三十二)

    什么是位域?为什么用到它? 先来看一个例子: public class Test {public static final byte STYLE_BOLD = 1<<0; // 1publ ...

  2. Effective Java笔记第五章枚举和注解第三节用EnumSet代替位域

    Effective Java笔记第五章枚举和注解 第三节用EnumSet代替位域 在以前如果一个枚举类型的元素主要用在集合中,一般就会使用int枚举模式.比如说: public class Demo ...

  3. 第 3 次读 Effective Java,这 58 个技巧最值!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:Dong GuoChao <Effective ...

  4. 读完《Effective Java》后,总结了 50 条开发技巧

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Dong GuoChao 来源 | https ...

  5. Effective Java读书笔记二:枚举和注解

    第30条:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外. 第31条:用实例域代替序数 枚举的ord ...

  6. 读完 Effective Java,我整理了 59 条技巧!(含pdf)

    点击⬆️方"逆锋起笔",公众号回复 编程资源领取大佬们推荐的学习资料 上一篇:CTO 写低级 Bug,致公司 70 GB 数据泄露! 作者:Dong GuoChao 链接:http ...

  7. Effective Java(第3版) 90条经验法则

    目录 第2章 创建和销毁对象 第1条:用静态工厂方法替代构造器 第2条:遇到多个构造器参数时要考虑使用构建器 例子 使用 第3条:用私有构造器或者枚举类型强化Singleton属性 例子 使用 第4条 ...

  8. 《Effective Java》真的是一本值得一直去钻研的好书

    文章目录 <Effective Java>读书笔记 第一章 引言 第二章 创建和销毁对象 1 考虑使用静态工厂方法替代构造方法** 2 当构造方法参数过多时使用builder(建造者) 模 ...

  9. 《Effective Java》阅读笔记(二)

    最近在看<Effective Java>这本书,顺便就记录一些笔记,记录一下书中的一些知识点以及对知识点的总结.一般情况会记录所有的知识点,但是知识点太过简单或者无归纳点总结的就不做详细记 ...

最新文章

  1. Java 第三周总结
  2. explorer.exe rundll32.exe病毒解决方案
  3. mui aniShow 动画属性
  4. 【概率DP】$P2059$ 卡牌游戏
  5. Citrix基础端口了解
  6. 【SQL练习题】case when实现按要求排序
  7. C++ 类的静态成员变量为什么一定要初始化
  8. 串口硬盘如何应用于并口硬盘计算机,并口硬盘和串口硬盘的区分与看图学习电脑硬盘的安装...
  9. MTK平台Camera图片的Exif信息
  10. 计算机isas测试,SAS硬盘测试:15,000转对决10,000转
  11. 输出今天是星期几并计算n天后的日期(万年历)
  12. JS实现二叉树添加节点,删除节点操作
  13. python量化策略——改进的美林时钟介绍(0)
  14. proguard.cfg 配置文件
  15. SIMULIA 官方技术论坛全年时间表新鲜出炉!
  16. springboot项目启动报错-案例情景介绍
  17. CGB2111-Day18
  18. 泰然金融创始人潘宝锋分析网贷行业发展动态
  19. UE4 安卓打包失败“Build-tool 31.0.0 is missing DX”
  20. GraalVM编译SpringBoot程序

热门文章

  1. 云原生之容器安全实践
  2. 4大JVM性能分析工具详解,及内存泄漏分析方案
  3. 领域应用 | 金融资管领域知识图谱的构建和应用
  4. 报名 | 全国知识图谱与语义计算大会(CCKS 2019)评测任务发布
  5. 玩转算法第七章-二叉树与递归
  6. 【LeetCode】3月25日打卡-Day10
  7. 【LeetCode】3月20日打卡-Day5
  8. 关于技术管理者应该如何做好工作安排的一点思考
  9. PHP自学3——在html的table标签中显示用户提交表单
  10. anddroid悬浮窗的手机QQ后台清理不掉的秘密