何为位域

位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位元的形式紧凑的储存,并允许程序员对此结构的位元进行操作。 这种数据结构的好处: 可以使数据单元节省储存空间,当程序需要成千上万个数据单元时,这种方法就显得尤为重要。 位段可以很方便的访问一个整數值的部分内容从而可以简化程序源代码。

位域,可以简单理解为一段二进制码,每一位表示一种状态。位运算的性能好,位域确实是不错的数据结构。

使用位域:

  1. public class Text {
  2. public static final byte STYLE_BOLD = 1<<0; // 1
  3. public static final byte STYLE_ITALIC = 1<<1; // 2
  4. public static final byte STYLE_UNDERLINE = 1<<2; // 4
  5. public static final byte STYLE_STRIKETHROUGH = 1<<3; // 6
  6. //Parameter is bitwise OR of zero or more STYLE_ constants
  7. public void applyStyles(int styles) { ... }
  8. }
  9. text.applyStyles(Text.STYLE_BOLD | Text.STYLE_ITALIC);

这段代码旨在通过位操作的方式将多种text风格进行组合。但是,很显然这是一种int枚举的方式,自然存在很多问题(见30条)。

使用EnumSet

标题说,用EnumSet代替位域,并不意味着位域是过气的数据结构、EnumSet给我们带来了一种全新的更优的数据结构。EnumSet并没有带来什么新东西,而是新瓶装旧酒,底层用的正是“过气”的位域这种数据结构。

使用EnumSet:

  1. public class Text{
  2. public enum Style{BOLD,ITALIC,UNDERLINE,STRIKETHROUGH}
  3. public void applyStyles(Set<Style> styles){
  4. //实现方案
  5. }
  6. }
  7. //客户端调用该方法为
  8. text.applyStyles(EnumSet.of(Style.BOLD,Style.ITALIC));

EnumSet类集位域的简洁和性能的优势,以及枚举类型的所有优点与一身。实际上EnumSet也有个缺点,即它无法创建不可变的EnumSet(Java1.6为止没有解决)。同时,可以用Collections.unmodifiable将EnumSet封装起来,但是间接性和性能会受到影响。