Установка перечисления на основе длинного значения - PullRequest
0 голосов
/ 30 января 2012

У меня есть перечисление, которое я пытаюсь инициализировать из длинного значения, полученного из базы данных.

public enum ArticlePermission {
   NONE(0),
   CAN_READ(2),
   CAN_EDIT(4),
   CAN_DELETE(8),
   CAN_CREATE(16);

   private long _value;

   public ArticlePermission(int val) {
     this._value = val;
   }


   public long getValue() {
     return this._value;
   }


   public EnumSet<ArticlePermission> init(long val) {
     EnumSet<ArticlePermission> es = EnumSet.of(ArticlePermission.NONE);

     for(ArticlePermission p : values()) {
        if(val & p.getValue() != 0) {
          es.add(p);
        }
     }



      return es;
   }

}

Я получаю ошибку компиляции, в которой оператор & нельзя использовать для длинного значения.

Как я могу сделать это правильно?

Ответы [ 2 ]

4 голосов
/ 30 января 2012

Или, если вы действительно хотите сделать побитовое сравнение, вам просто нужны дополнительные скобки:

if((val & getValue()) != 0) {
   // do something
   }
1 голос
/ 30 января 2012

Вы хотели использовать && (логическое И) вместо & (побитовое И)? Для условий if вы хотите использовать логическое И (&&).

if(val!=0 && p!=null && p.getValue() != 0) {
          es.add(p);
}

Для побитового & вам нужно использовать его следующим образом: -

if((val & p.getValue()) != 0)) {
              es.add(p);
}
...