如何更好地表示用户权限?

Nic*_*ick 5 java oop permissions data-structures

在我的系统中,我有一个类(20?)的类,用于final booleans定义此用户类型具有的权限.

有什么更好的方法呢?

我确定有很多这方面的例子,但我不知道关键字.

Vit*_*nko 12

您可以利用枚举,例如:

public enum Permission {
    READ, WRITE;
}

public class User {

    private final EnumSet<Permission> permissions;

    public User(Permission... permissions) {
       this.permissions = EnumSet.copyOf(Arrays.asList(permissions));
    }

    public boolean hasPermission(Permission permission) {
        return permissions.contains(permission);
    }

    //...
}

User user = new User(Permission.READ, Permission.WRITE);
Run Code Online (Sandbox Code Playgroud)

  • +1,这就是我对tdammers回答的评论.@Vash - 这完全没问题,该字段在构造函数中初始化. (3认同)

tda*_*ers 8

上课Permission,给每个人User一个集合.如果权限在用户的权限集合中,则用户具有该权限,否则不具有该权限.

  • @Tim:他明确要求比最终布尔人更好的方式. (5认同)
  • 不,他要求比最终的布尔人更好的方法 (2认同)

Dam*_*ash 5

你可以使用面具

public interface IPersmisions {

 public static final int NONE = 1 << 0;
 public static final int LEVEL1 = 1 << 1;
 public static final int LEVEL2 = 1 << 2;
 public static final int LEVEL3 = 1 << 3;
 public static final int LEVEL4 = 1 << 4;
 public static final int LEVEL5 = 1 << 5;
 public static final int LEVEL6 = 1 << 6;
 public static final int LEVEL7 = 1 << 7;
 public static final int LEVEL8 = 1 << 8;
 public static final int LEVEL9 = 1 << 9;
}
Run Code Online (Sandbox Code Playgroud)

在使用中你添加

int permisions = IPersmisions.NONE;

    public boolean checkPermission(int permission) {
        return (permissions & permission) != 0;
    }

    public void addPermission(int permission) {
            permissions = (permissions | permission);
    }

    public void removePermission(int permission) {
        permissions = (permissions & ~permission);
    }
Run Code Online (Sandbox Code Playgroud)

比您可以为用户设置一个轻松设置的组

public interface IPermisionGroup extends IPermisions {

  public static final int LEVEL1_2_3 = LEVEL1 | LEVEL2 | LEVEL3; 
  public static final int LEVEL4_5_6 = LEVEL4 | LEVEL5 | LEVEL6; 
  public static final int LEVEL7_8_9 = LEVEL7 | LEVEL8 | LEVEL9; 

}
Run Code Online (Sandbox Code Playgroud)

在您可以使用的代码中就是这样

   user.addPermision(IPermisions.LEVEL1);
Run Code Online (Sandbox Code Playgroud)

要么

   user.addPermision(IPermisions.LEVEL1 | IPermision.LEVEL2);
Run Code Online (Sandbox Code Playgroud)

要么

user.addPermision(IPermisionGroup.LEVEL1_2_3);
Run Code Online (Sandbox Code Playgroud)