Java 枚举与创建位掩码和检查权限混淆

标签 java permissions bit-manipulation

我想将这个 c# 权限模块移植到 java,但是当我无法将数值保存在数据库中然后将其转换为枚举表示时,我很困惑如何才能做到这一点。

在 C# 中,我创建了一个这样的枚举:

public enum ArticlePermission
{
     CanRead   = 1,
     CanWrite  = 2,
     CanDelete = 4,
     CanMove   = 16
}

然后我可以创建一个权限集,例如:

ArticlePermission johnsArticlePermission = ArticlePermission.CanRead | ArticlePermission.CanMove;

然后我使用以下方法将其保存到数据库中:

(int)johnsArticlePermission

现在我可以从数据库中以整数/长整数形式读取它,并将其转换为:

johnsArticlePermission = (ArticlePermission) dr["articlePermissions"];

我可以像这样检查权限:

if(johnsArticlePermission & ArticlePermission.CanRead == ArticlePermission.CanRead) 
{

}

我如何在 Java 中执行此操作? 据我了解,在 java 中,您可以将枚举转换为数值,然后再将其转换回 java 枚举。

想法?

最佳答案

你真正需要的是一个 EnumSet ,在 API 中这样描述:

Enum sets are represented internally as bit vectors. This representation is extremely compact and efficient. The space and time performance of this class should be good enough to allow its use as a high-quality, typesafe alternative to traditional int-based "bit flags."

枚举是底层的类,因此您可以向其添加方法。例如,

public enum ArticlePermission
{
  CanRead(1),
  CanWrite(2),
  CanDelete(4),
  CanMove(16); // what happened to 8?

  private int _val;
  ArticlePermission(int val)
  {
    _val = val;
  }

  public int getValue()
  {
    return _val;
  }

  public static List<ArticlePermission> parseArticlePermissions(int val)
  {
    List<ArticlePermission> apList = new ArrayList<ArticlePermission>();
    for (ArticlePermission ap : values())
    {
      if (val & ap.getValue() != 0)
        apList.add(ap);
    }
    return apList;
  }
}

parseArticlePermissions 将为您提供 ListArticlePermission 对象的整数值,大概是通过对 ArticlePermission< 的值进行 ORing 创建的 对象。

这里有更详细的 explanation of EnumSet .

关于Java 枚举与创建位掩码和检查权限混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9048225/

相关文章:

java.rmi.RemoteException : EJB Exception: ; nested exception is:

asp.net - Windows Azure - 网络信息异常 (0x80004005) : Access is denied - HttpWebRequest

windows - 开始-> 运行对话框 - "Run as Administrator"复选框?

从属性文件读取时出现 java.util.ConcurrentModificationException

java - 为输入的每个字符分配一个值并显示输入的值

java - PKCS#12 : DerInputStream. getLength() 异常

php - 如何使用 PHP 向某些用户授予访问权限

bit-manipulation - (按位逻辑)与 0x7F 进行“与”运算可以实现什么目的?

image - 如何创建空(0x0)图像?

actionscript - 对 RGB 值使用逻辑位移