Путаница в перечислении Java с созданием битовой маски и проверкой разрешений - PullRequest
7 голосов
/ 29 января 2012

Я хочу перенести этот модуль разрешений 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.

Идеи

1 Ответ

8 голосов
/ 29 января 2012

Здесь вам действительно нужен EnumSet , описанный в API следующим образом:

Наборы перечислений представляются внутри как битовые векторы. это Представление чрезвычайно компактно и эффективно. Пространство и время производительность этого класса должна быть достаточно хорошей, чтобы его можно было использовать как высококачественная, безопасная альтернатива традиционным битам флаги ".

Вот хороший обзор EnumSet и еще один: Игра с EnumSet .

enum - это класс под капотом, так что вы можете добавлять к нему методы. Например,

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 даст вам List из ArticlePermission объектов из целочисленного значения, предположительно созданного посредством ORing значения ArticlePermission объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...