跟我学(Effective Java 2)第32条:用EnumSet代替位域

第32条:用EnumSet代替位域

如果一个枚举类型的元素主要用在集合中,一般使用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) {
        ...
    }
}

这种表示法让你用OR位运算将几个常量合并到一个集合中,称作位域(bit field):

text.applyStyles(STYLE_BOLD | STYLE_ITALIC);

位域表示法也允许利用位操作,有效地执行像union(联合)和intersection(交集)这样的集合操作。但位域有着int枚举常量的所有缺点,甚至更多。当位域以数字形式打印时,翻译位域比翻译简单的int枚举常量要困难得多。甚至,要遍历位域表示的所有元素也没有很容易的方法。

java.util包提供了EnumSet类来有效地表示从单个枚举类型中提取多个值的多个集合,这个类实现Set接口,提供丰富的功能、类型安全性,以及可以从任何其他Set实现中得到的互用性。

public class Text{

	public enum Style{
		BOLD,ITALIC,UNDERLINE,STRIKETHROUGH
	}
	
	public void applyStyles(Set