Effective Java~36. 用EnumSet 代替位域

        如果枚举类型的元素主要用于集合中,一般来说使用 int 枚举模式(条目 34),下面将 2 的不同倍数赋值给每个常量:

// Bit field enumeration constants - OBSOLETE!
public class Text {
	public static final int STYLE_BOLD = 1 << 0; // 1
	public static final int STYLE_ITALIC = 1 << 1; // 2
	public static final int STYLE_UNDERLINE = 1 << 2; // 4
	public static final int STYLE_STRIKETHROUGH = 1 << 3; // 8
	
	// Parameter is bitwise OR of zero or more STYLE_ constants
	public 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 best
	public void applyStyles(Set<Style> styles) { ... }
}

        这里是将 EnumSet 实例传递给 applyStyles 方法的客户端代码。 EnumSet 类提供了一组丰富的静态工厂,可以轻松创建集合,其中一个代码如下所示:

text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));

        请注意, applyStyles 方法采用Set<Style> 而不是EnumSet<Style> 参数。 尽管所有客户端都可能会将EnumSet 传递给该方法,但接受接口类型而不是实现类型通常是很好的做法(条目 64)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值