第32条:用EnumSet代替位域
2024-08-29 16:48:05
如果一个枚举类型的元素主要用在集合中,一般使用int枚举模式,将2的不同倍数赋予每个常量:
public class Text {
public static final int STYLE_BOLD = 1 << 0;
public static final int STYLE_ITALIC = 1 << 1;
public static final int STYLE_UNDERLINE = 1 << 2;
public static final int STYLE_STRIKETHROUGH = 1 << 3; public void applyStyles(int styles) {
...
}
}
text.applyStyles(STYLE_BOLD | STYLE_ITALIC);
表示为文字添加STYLE_BOLD和STYLE_ITALIC两种风格。
如果文字要添加的风格很多,applyStyles的参数就非常长,而且,当有64种风格以上的时候,就没法使用这种办法,因为1<<65已经超出了int的范围。
java.util包提供了EnumSet类来有效地表示从单个枚举类型中提取多个值的多个集合,这个类实现Set接口,提供丰富的功能、类型安全性,以及可以从任何其他Set实现中得到的互用性。
public class Text {
public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH}; public void applyStyles(Set<Style> styles) {
...
}
}
EnumSet提供静态工厂来创建集合,
text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
EnumSet.of方法返回一个包含Style.BOLD, Style.ITALIC的集合。
最新文章
- scikit-learn 和pandas 基于windows单机机器学习环境的搭建
- 【mysql的编程专题①】流程控制与其他语法
- JS 操作 radio input(cc问卷管理)
- linux防火墙解封某端口
- Qwerty78 Trip(组合数,规律,逆元)
- 从后台绑定数据到ligerui 的comboBox下拉框组件
- uva10718 - Bit Mask(贪心)
- offset()值不准问题
- HTML5学习笔记<;六>;: HTML5框架, 背景和实体
- PHP之流程的控制
- CMD命令操作MySql数据库详解
- 号称了解mesos双层调度的你,先来回答下面这五个问题!
- 【bzoj4008 hnoi2015】 亚瑟王
- myeclipse附加源码进行查看的方法
- CentOS7.5 GlusterFS 分布式文件系统集群环境搭建
- codeforces263B
- Going Home POJ - 2195 (最小费用最大流)
- VS2017 15.6之后支持直接反编译了
- Centos 7 设置ssh只允许特定用户从指定的IP登录
- CF444(Div. 1简单题解)