【问题标题】:Java enum confusion with creating a bitmask and checking permissionsJava 枚举与创建位掩码和检查权限的混淆
【发布时间】:2012-02-21 07:45:55
【问题描述】:

我想将此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枚举。

想法?

【问题讨论】:

标签: java permissions bit-manipulation


【解决方案1】:

您真正需要的是EnumSet,API 中这样描述:

枚举集在内部表示为位向量。这 表示非常紧凑和高效。空间和时间 此类的性能应该足够好,以允许其用作 高质量、类型安全的替代传统基于 int 的“位” 标志。”

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

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 对象的值进行或运算创建的。

这里有更详细的explanation of EnumSet

【讨论】:

  • values() 是从哪里来的?
  • @Blankman values()feature of enums
  • 如果使用 Android,请避免使用 EnumSets,这些对 DalvikVM 来说效率非常低。
  • ART 的情况是否有所改变?
  • 两个博客链接现在都已损坏(但文档链接仍然有效)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多