我遇到了为组织定义安全角色的情况。这些选择是一组已知的枚举默认值,以及任意数量的自定义角色的可能性。角色定义员工在组织中拥有的权限。例如,用户可以是;

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())。

10-07 16:16
查看更多