Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更好地表示用户权限?_Java_Data Structures_Oop_Permissions - Fatal编程技术网

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

Java 如何更好地表示用户权限?,java,data-structures,oop,permissions,Java,Data Structures,Oop,Permissions,在我的系统中,我有一个负载为(20?finalbooleans的类,用于定义此用户类型的权限 有什么更好的方法可以做到这一点 我肯定有很多关于这个的例子,但我不知道关键词。创建一个类权限,并为每个用户提供它们的集合。如果权限在用户的权限集合中,则该用户具有该权限,否则不具有该权限。如果您不知道关键字和语法,您可能需要阅读一本关于Java的书或在线学习一些教程。但是,类可以如下所示: public class User { private final boolean admin, superus

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

有什么更好的方法可以做到这一点


我肯定有很多关于这个的例子,但我不知道关键词。

创建一个类
权限
,并为每个
用户
提供它们的集合。如果权限在用户的权限集合中,则该用户具有该权限,否则不具有该权限。

如果您不知道关键字和语法,您可能需要阅读一本关于Java的书或在线学习一些教程。但是,类可以如下所示:

public class User {

private final boolean admin, superuser, guest;

public User(boolean admin, boolean superuser, boolean guest) {
    this.admin = admin;
    this.superuser = superuser;
    this.guest = guest;
}

public boolean isAdmin() {
    return admin;
}

public boolean isSuperuser() {
    return superuser;
}

public boolean isGuest() {
    return guest;
}

// and so on
}

您可以利用枚举,例如:

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);
公共枚举权限{
读,写;
}
公共类用户{
私有最终枚举集权限;
公共用户(权限…权限){
this.permissions=EnumSet.copyOf(Arrays.asList(permissions));
}
公共权限(权限){
返回权限。包含(权限);
}
//...
}
用户用户=新用户(Permission.READ、Permission.WRITE);

@tdammers建议的完整示例:

class enum Permission {
    WRITE, READ, EXECUTE, GROUP, OWNER
}

public class User {
    protected Set<Permission> permissions;

    public User() {
        permissions = new EnumSet<Permission>();
    }

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

    public void addPermisssion(Permission p) {
        permissions.add(p);
    }

    public void removePermisssion(Permission p) {
        permissions.remove(p);
    }
}

//usage
User u = new User();
u.addPermission(Permission.READ);
System.out.writeln(u.hasPermission(Permission.WRITE));
u.removePermission(Permission.READ);
类枚举权限{
写入、读取、执行、组、所有者
}
公共类用户{
受保护的设置权限;
公共用户(){
权限=新枚举集();
}
公共权限(权限p){
返回权限。包含(p);
}
公共无效添加权限(权限p){
权限。添加(p);
}
公共无效删除权限(权限p){
权限。删除(p);
}
}
//用法
用户u=新用户();
u、 addPermission(Permission.READ);
System.out.writeln(u.hasPermission(Permission.WRITE));
u、 removePermission(Permission.READ);

您可以使用此掩码

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;
}
您可以轻松地为用户设置组

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; 

}
你可以使用的代码是这样的

   user.addPermision(IPermisions.LEVEL1);


多态性,而不是条件句

class User {
    final Print print;
    User(Print print) {
        this.print = print;
    }
}

interface Print {
    void print();
}

class CanPrint implements Print {
    public void print() { do whatever it takes to print a user }
}

class CannotPrint implements Print {
    public void print() { throw null; }
}

你能粘贴一些代码片段来更好地理解你在做什么吗?他明确要求使用最终布尔值。@蒂姆:他明确要求使用比最终布尔值更好的方法。不,他要求使用比最终布尔值更好的方法一个特别好的方法是将
权限
类设为枚举(从概念上讲,可能是这样,除非应用程序对动态创建的角色执行了一些异常操作)。然后,当您有20个角色时,您需要将EnumSet.contains(Permission.ADMIN)检查20次,然后通过调用类似于
EnumSet.contains(Permission.ADMIN)
@Andrzej Doyle的命令来获得非常清晰的代码代码非常干净。基于枚举的角色在很长一段时间内都是非常有限的选项。顺便说一句:这段代码不会编译,因为您创建了一个没有初始化+1的最终字段,这就是我在对tdammers答案的评论中的意思。@Vash-这很好,字段在构造函数中初始化。滚动您自己的bitma你一定是在跟我开玩笑。@eopchwolf:这有什么不对吗?顺便说一句,不是在.NET中,而是在Java中。
   user.addPermision(IPermisions.LEVEL1 | IPermision.LEVEL2);
user.addPermision(IPermisionGroup.LEVEL1_2_3);
class User {
    final Print print;
    User(Print print) {
        this.print = print;
    }
}

interface Print {
    void print();
}

class CanPrint implements Print {
    public void print() { do whatever it takes to print a user }
}

class CannotPrint implements Print {
    public void print() { throw null; }
}