在java中创建权限位掩码

我想做这样的事情:

public enum Permissions { CanBlah1, CanBlah2, CanBlah3 } byte[] userPerm = Permissions.CanBlah1 | Permissions.CanBlah2; // check permssions // if(userPerm && Permissions.CanBlah1 == Permissions.CanBlah1) { // do something } 

你能用Java做到这一点吗? (我来自ac#背景)

您可以使用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 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 } } 

这是另一种选择,类似于序数解决方案,除了你可以使用| 和&运营商:

  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()并将其用于位操作。 当然因为你无法定义枚举的序数,你必须插入伪造的值才能使序数正确

 enum Example { Bogus, --> 0 This, --> 1 That, --> 2 ThisOrThat --> 3 }; 

请注意,需要引入Bogus枚举

 ThisOrThat.ordinal() == This.ordinal() | That.ordinal() 

如果您坚持使用Java 7时代(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()); } 

}

据我所知,对于枚举类型,未定义了bitwise运算符