我遇到了为组织定义安全角色的情况。这些选择是一组已知的枚举默认值,以及任意数量的自定义角色的可能性。角色定义员工在组织中拥有的权限。例如,用户可以是;
public enum Role
{
Owner, Administrator, User, Guest;
}
但是,组织也可能需要自己的自定义角色(例如PowerUser)。我正在寻找一种声明具有已知枚举值列表(即一个枚举)但可以提供任意数量的自定义值(即一个类)的对象的最佳方法。
一个简单的方法如下(添加自定义枚举值):
public enum Role
{
Owner, Administrator, User, Guest, Custom;
public BaseRole asRole()
{
//switch statement returning the BaseRole depending on the enum value.
}
}
public class BaseRole
{
Set<Permission> permissions;
}
此选项的问题是,如果选择枚举值自定义,则粘合代码将变得非常冗长。由于拥有所有可能的自定义角色的自定义值的行为将不同于其他值,因此接受角色的每个函数都需要特殊的胶水来处理自定义。
理想情况下,最好是这样的:
public enum Role
{
Owner, Administrator, User, Guest, Set<Custom>;
}
编辑:
供参考,用户类别为
public class User
{
Set<Role> roles;
}
最佳答案
一种可能的解决方案是回顾enum
之前的Java版本中的伪枚举实现。例如。:
public class Role {
public static final Role OWNER = new Role("OWNER");
public static final Role ADMIN = new Role("ADMIN");
public static final Role USER = new Role("USER");
public static final Role GUEST = new Role("GUEST");
private String name;
// getter, setter, constructor, toString(), hashCode(), equals()
}
因此,每当需要
Role
时,您都可以使用最终字段:Role r = Role.OWNER;
并仍然定义自定义的:
Role r = new Role("Cook");
谨慎一点,它甚至可以允许在变量和预定义值之间进行
==
相等性检查,但是我建议不要使用它(始终使用equals()
)。