Java 从枚举集中检索数字位值

Java 从枚举集中检索数字位值,java,Java,我使用一个枚举集来执行按位权限操作,正如有效Java第32项中所建议的那样。这很好,也很简洁,但我需要提取数字位值,以便与需要数字值的旧系统接口。使用位集使用枚举序号值很简单,但枚举集似乎没有内置它。我必须自己写吗 public enum Permissions { EDIT, // 1 SAVE, // 2 DELETE, // 4 WHATEVER // 8 }; EnumSet<Flags> flags =

我使用一个枚举集来执行按位权限操作,正如有效Java第32项中所建议的那样。这很好,也很简洁,但我需要提取数字位值,以便与需要数字值的旧系统接口。使用位集使用枚举序号值很简单,但枚举集似乎没有内置它。我必须自己写吗

public enum Permissions {
      EDIT,     // 1
      SAVE,     // 2
      DELETE,   // 4
      WHATEVER  // 8
};

EnumSet<Flags> flags = EnumSet.of(EDIT, DELETE);
// long numericVal = flags.getLong(); // should be 5, but doesn't exist

您可以首先向枚举添加一个返回其数值的方法:

public enum Permissions
{
  EDIT,     // 1
  SAVE,     // 2
  DELETE,   // 4
  WHATEVER; // 8

  public long getNumericValue()
  {
     return (1L << ordinal());
  }

};
然后,循环集合中的条目,求和这些值

public long getLong(EnumSet<Permissions> flags)
{
  long result;
  result = 0;
  for (Permissions element: flags)
    result += element.getNumericValue();
  return (result);
}

为什么不将该值作为实例字段添加到枚举中?谢谢。我想也许它已经有了内置的功能,因为这正是EnumSet可以使用的用例类型,但是看起来它没有。