欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中EnumSet代替位域代码详解

程序员文章站 2023-12-03 09:56:22
本文研究的主要是java中enumset代替位域的相关内容,具体介绍如下。 读书笔记《effective java 中文版 第2版》 位域表示法允许利用位操作,有效地执...

本文研究的主要是java中enumset代替位域的相关内容,具体介绍如下。

读书笔记《effective java 中文版 第2版》

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

//bit field enumeration constant - obsolete
public class test {
  public static final byte style_bold     = 1<<0; // 1
  public static final byte style_italic    = 1<<1; // 2
  public static final byte style_underline   = 1<<2; // 4
  public static final byte style_strikethrough = 1<<3; // 6

  //parameter is bitwise or of zero or more style_ constants
  public void applystyles(int styles) { ... }
}

java.util 包提供了enumset类来有效地表示从单个枚举类型中提取的多个值的多个集合。这个类实现set接口,提供了丰富的功能,类型安全性,以及可以从任何其他set实现中得到的互用性。但是在内部具体的实现上,每个enumset内容都表示为位矢量。如果底层的枚举类型有64个或者更少的元素——大多数如此。整个enumset就用单个long来表示,因此它的性能比的上位域的性能。批处理,如removeall和retainall,都是利用位算法来实现的。就像手工替代位域实现得那样。但是可以避免手工操作时容易出现的错误以及不太雅观的代码,因为enumset替你完成了这项艰巨的工作。`

//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) { 
    system.out.println(styles);
  }

  public void test() {
    applystyles(enumset.of(style.bold, style.italic));
  }
}

执行 test() ,输出 [bold, italic]

enumset 类集位域的简洁和性能优势及枚举类型的所有优点于一身,所以我们没有理由再使用位域表示法。除非是组成通信协议字段。

但实际上enumset也有一个缺点——它无法创建不可变的enumset,但我们可以用collections.unmodifiableset将enumset封装起来,但是简洁性和性能都会受到影响。

public void test() {
  enumset<style> styles = enumset.of(style.bold, style.italic);
  set<style> unmodifiablestyle = collections.unmodifiableset(styles);
  unmodifiablestyle.add(style.underline);
}

这样如果往 unmodifiableset 中添加元素就会报 java.lang.unsupportedoperationexception

总结

以上就是本文关于java中enumset代替位域代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!