我遇到了为组织定义安全角色的情况。选项是一组已知的枚举默认值,以及任意数量的自定义角色的可能性。角色定义员工在组织中拥有的权限。例如,用户可以是;
public enum Role
{
Owner, Administrator, User, Guest;
}
但是,组织也可能需要自己的自定义角色(例如A 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;
}
此选项的问题在于,如果选择了枚举值custom,则胶水代码将变得非常冗长。由于包含所有可能的自定义角色的自定义值的行为与其他值的行为不同,因此接受角色的每个函数都需要特殊的粘合来处理自定义。
理想情况下,这样的事情可能是最好的:
public enum Role
{
Owner, Administrator, User, Guest, Set<Custom>;
}
编辑:
作为参考,用户类将是
public class User
{
Set<Role> roles;
}
答案 0 :(得分:2)
一种可能的解决方案是回顾前enum
Java版本中的伪枚举实现。 E.g:
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()
。)
答案 1 :(得分:0)
也许您正在寻找的是EnumSet?
http://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html
答案 2 :(得分:0)
这是我采用的解决方案。
public interface Role
{
String getName();
}
public enum StandardRole implements Role
{
Owner, Administrator, User, Guest;
@Override
public String getName()
{
return this.name();
}
}
public class CustomRole implements Role
{
private String name;
public CustomRole(String name)
{
this.name = name;
}
@Override
public String getName()
{
return this.name;
}
}
public class User
{
Set<Role> roles;
}