gpt4 book ai didi

java - 类和枚举功能的混合

转载 作者:行者123 更新时间:2023-11-30 03:59:11 24 4
gpt4 key购买 nike

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

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 r = Role.OWNER;

并且仍然定义自定义的:

Role r = new Role("Cook");

谨慎地说,它甚至可能允许在变量和预定义值之间进行 == 相等性检查,但我建议不要这样做(始终使用 equals() )。

关于java - 类和枚举功能的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22357176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com