【发布时间】:2011-03-24 17:02:50
【问题描述】:
在我的系统中,我有一个负载为 (20?) final booleans 的类,用于定义此用户类型的权限。
有什么更好的方法来做到这一点?
我确信有很多关于此的示例,但我不知道关键字。
【问题讨论】:
-
能否请您粘贴一些代码 sn-p 以更好地了解您正在尝试做的事情。
标签: java data-structures oop permissions
在我的系统中,我有一个负载为 (20?) final booleans 的类,用于定义此用户类型的权限。
有什么更好的方法来做到这一点?
我确信有很多关于此的示例,但我不知道关键字。
【问题讨论】:
标签: java data-structures oop permissions
您可以利用枚举,例如:
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);
【讨论】:
创建一个类Permission,并为每个User 提供它们的集合。如果权限在用户的权限集合中,则用户有权限,否则没有。
【讨论】:
Permission 类成为一个枚举(从概念上讲,它可能是一个枚举,除非应用程序正在使用动态创建的角色做一些不寻常的事情)。然后通过调用EnumSet.contains(Permission.ADMIN) 之类的代码,您可以获得非常清晰的代码。
您可以为此使用掩码
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;
}
在用过你加
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);
}
比你可以轻松地为用户设置一个组
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);
或
user.addPermision(IPermisions.LEVEL1 | IPermision.LEVEL2);
或
user.addPermision(IPermisionGroup.LEVEL1_2_3);
【讨论】:
@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);
【讨论】:
如果您不知道关键字和语法,您可能想阅读有关 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
}
【讨论】:
多态,而不是条件。
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; }
}
【讨论】: