温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中EnumSet代替位域的示例分析

发布时间:2021-08-25 10:21:12 来源:亿速云 阅读:223 作者:小新 栏目:编程语言

这篇文章给大家分享的是有关Java中EnumSet代替位域的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

具体介绍如下。

位域表示法允许利用位操作,有效地执行先 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代替位域的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI