Создать маску разрешений в java
Я хочу сделать что-то вроде этого:
public enum Permissions
{
CanBlah1,
CanBlah2,
CanBlah3
}
byte[] userPerm = Permissions.CanBlah1 | Permissions.CanBlah2;
// check permssions
//
if(userPerm && Permissions.CanBlah1 == Permissions.CanBlah1)
{
// do something
}
Можете ли вы сделать это на Java? (Я исхожу из фона С#)
Ответы
Ответ 1
Вы можете легко сделать это, используя EnumSet
import java.util.EnumSet;
import static java.util.EnumSet.of;
import static java.util.EnumSet.range;
import static so.User.Permissions.CanBlah1;
import static so.User.Permissions.CanBlah2;
import static so.User.Permissions.CanBlah3;
public class User {
public enum Permissions {
CanBlah1,
CanBlah2,
CanBlah3
}
public static void main(String[] args) throws Exception {
EnumSet<Permissions> userPerms = of(CanBlah1, CanBlah2);
System.out.println(userPerms.contains(CanBlah1)); //true
System.out.println(userPerms.contains(CanBlah2)); //true
System.out.println(userPerms.contains(CanBlah3)); //false
System.out.println(userPerms.containsAll(of(CanBlah1, CanBlah3))); //false
System.out.println(userPerms.containsAll(range(CanBlah1, CanBlah2))); //true
System.out.println(userPerms.containsAll(range(CanBlah1, CanBlah3))); //false
}
}
Ответ 2
Это еще один вариант, аналогичный порядковому решению, за исключением того, что вы можете использовать | и операторы с этим:
public enum Permissions {
CanBlah1(1),
CanBlah2(2),
CanBlah3(4);
public int value;
Permissions(int value) {
this.value = value;
}
public int value() {
return value;
}
}
public static void main(String[] args) {
int userPerm = Permissions.CanBlah1.value() | Permissions.CanBlah2.value();
// check permssions
//
if((userPerm & Permissions.CanBlah1.value()) == Permissions.CanBlah1.value())
{
// do something
}
}
или
public enum Permissions {
CanBlah1,
CanBlah2,
CanBlah3;
public int value() {
return 1<<ordinal();
}
}
public static void main(String[] args) {
int userPerm = Permissions.CanBlah1.value() | Permissions.CanBlah2.value();
// check permssions
//
if((userPerm & Permissions.CanBlah1.value()) == Permissions.CanBlah1.value())
{
// do something
}
}
Ответ 3
Хотя я бы не рекомендовал его, вы можете запросить порядковый номер() перечисления и использовать его для бит-операций. Конечно, поскольку вы не можете определить, что такое порядковый номер для перечисления, вам нужно вставить фиктивные значения, чтобы получить ординалы вправо
enum Example {
Bogus, --> 0
This, --> 1
That, --> 2
ThisOrThat --> 3
};
Обратите внимание, что перечисление Bogus необходимо ввести так, чтобы
ThisOrThat.ordinal() == This.ordinal() | That.ordinal()
Ответ 4
Если вы застряли в предварительной Java 7 Era (Android), вы можете попробовать следующий код:
public enum STUFF_TO_BIT_BASK {
THIS,THAT,OTHER;
public static int getBitMask(STUFF_TO_BIT_BASK... masks) {
int res = 0;
for (STUFF_TO_BIT_BASK cap : masks) {
res |= (int) Math.pow(2, cap.ordinal());
}
return res;
}
public boolean is(int maskToCheck){
return maskToCheck | (int) Math.pow(2, this.ordinal());
}
}
Ответ 5
Насколько я знаю, побитовый оператор undefined для типов перечисления