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

Bla*_*man 8 java permissions bit-manipulation

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

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

public enum ArticlePermission
{
     CanRead   = 1,
     CanWrite  = 2,
     CanDelete = 4,
     CanMove   = 16
}
Run Code Online (Sandbox Code Playgroud)

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

ArticlePermission johnsArticlePermission = ArticlePermission.CanRead | ArticlePermission.CanMove;
Run Code Online (Sandbox Code Playgroud)

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

(int)johnsArticlePermission
Run Code Online (Sandbox Code Playgroud)

现在我可以将它作为整数/长整数从数据库中读出来,然后将其转换为:

johnsArticlePermission = (ArticlePermission) dr["articlePermissions"];
Run Code Online (Sandbox Code Playgroud)

我可以检查权限,如:

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

}
Run Code Online (Sandbox Code Playgroud)

我怎么能在java中这样做?根据我的理解,在java中,您可以将枚举转换为数值,然后将其转换回java枚举.

想法?

Pau*_*aul 9

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

枚举集在内部表示为位向量.这种表现非常紧凑和高效.这个类的空间和时间性能应该足够好,以允许它作为传统的基于int的"位标志"的高质量,类型安全的替代品.

这是EnumSet的一个很好的概述,另一个是:使用EnumSet.

枚举是引擎盖下的一个类,因此您可以为其添加方法.例如,

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

parseArticlePermissions会给你一个整数值ListArticlePermission对象,大概是通过ORing ArticlePermission对象的值来创建的.