我正在使用EnumSet来执行按位Java权限(第32项中的建议)中的按位权限操作。这很简洁,但是我需要提取数字位值,以便与需要数字值的旧系统连接。使用BitSet可以很容易地使用枚举序数值,但是EnumSet似乎没有内置它。我是否必须自己编写它?

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

关于java - 从EnumSet检索数字位值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52890707/

10-09 16:37