位域(Bit Field)这个概念不常见,它可以把数据以二进制位的形式紧凑的存储,它允许程序对此结构的位进行操作。早期计算机资源十分珍贵,使用位域可以十分明显的减少内存占用,提升运行速度。
当我们在使用int 常量时,可以使用位域来表示枚举类型:
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) {.....}
}
这样使用的问题在于:
1:在编写API 时,就必须先预测最多需要多少位。
2:要给位域选择对应的类型,int或long(这决定的数字的最大值)
而使用java包装好的EnumSet 就可以避开上述问题:
public class Text{
public enum Style{BOLD,ITALIC,UNDERLINE,STRIKETHROUGH}
public void applyStyles(Set<Style> styles){
//......
}
}
EnumSet的性能与位域相当同时事还继承了Cloneable 和Serializable接口,功能更加强大。

image.png
当一个枚举类型的元素主要用于集合中时,应该使用EnumSet.
系统中使用的很少,目前看到的都是在里程碑相关部分看到。之后再遇到类似场景时可以实践一下。