首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EnumSet‘和’运算

EnumSet‘和’运算
EN

Stack Overflow用户
提问于 2009-05-23 17:44:34
回答 2查看 3.2K关注 0票数 3

我正在将一些使用int枚举模式的旧代码移植到Enum和EnumSet。这很容易,但我不知道如何将以下代码转换为EnumSet:

代码语言:javascript
复制
int mask = (kind == 'C' ? CLASS_MODIFIERS
            : kind == 'F' ? FIELD_MODIFIERS
            : kind == 'M' ? METHOD_MODIFIERS
            : (CLASS_MODIFIERS | FIELD_MODIFIERS | METHOD_MODIFIERS));
int bad_flags = flags & ~mask; // <--- this
flags &= mask; // <--- and this

~mask像键入EnumSet.complementOf一样简单,但我不知道&是如何做到的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-23 17:50:27

您希望使用Set方法retainAll来获得两个集合的交集:

代码语言:javascript
复制
public class Test {
  public enum Kind { CLASS, FIELD, METHOD }

  public void applyMask(char kind, EnumSet<Kind> flags) {
    final EnumSet<Kind> mask;
    switch (kind) {
      case 'C': mask = EnumSet.of(Kind.CLASS);    break;
      case 'F': mask = EnumSet.of(Kind.FIELD);    break;
      case 'M': mask = EnumSet.of(Kind.METHOD);   break;
      default:  mask = EnumSet.allOf(Kind.class); break;
    }
    EnumSet<Kind> badFlags = EnumSet.copyOf(flags);
    badFlags.removeAll(mask); // See note below
    flags.retainAll(mask);
  }
}

注意:我以前用下面的行来代替更简单的removeAll。汤姆·霍廷指出,removeAll更简单,达到了同样的目的。最初,我只是尽可能地复制OP的原始逻辑,而没有尝试优化。

代码语言:javascript
复制
    badFlags.retainAll(EnumSet.complementOf(mask));
票数 6
EN

Stack Overflow用户

发布于 2009-05-23 17:50:53

CLASS_MODIFIERSFIELD_MODIFIERSMETHOD_MODIFIERS可能适合作为常量保留,因为它们被用作位掩码。该链接可能有助于澄清此代码的要点。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/902025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档