EnumSet 'and' 手术

发布于 2024-07-21 02:25:29 字数 607 浏览 3 评论 0原文

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

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 一样简单,但我不知道如何做&

I'm porting some old code that uses the int enum pattern to Enum and EnumSet. It is very easy but I don't know how translate the following code to EnumSet: :

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 is simple as typing EnumSet.complementOf but I don't see how do &.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

陌路终见情 2024-07-28 02:25:29

您想要使用 Set 方法 retainAll 来获取两个集合的交集:

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。 Tom Hawtin 指出 removeAll 更简单并且达到了相同的目的。 最初,我只是尽可能地复制OP的原始逻辑,而没有尝试优化。

    badFlags.retainAll(EnumSet.complementOf(mask));

You want to use the Set method retainAll to get the intersection of two sets:

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);
  }
}

Note: I previously had the following line in place of the simpler removeAll. Tom Hawtin pointed out that removeAll is simpler and achieves the same end. Originally, I just copied the OP's original logic as closely as possible, without trying to optimize.

    badFlags.retainAll(EnumSet.complementOf(mask));
太阳哥哥 2024-07-28 02:25:29

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

CLASS_MODIFIERS, FIELD_MODIFIERS, and METHOD_MODIFIERS might be appropriate to leave as constants, since they are being used as bit masks. The link might help to clarify the point of this code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文