Java 拥有枚举声明事项的顺序是一种不好的做法吗?

Java 拥有枚举声明事项的顺序是一种不好的做法吗?,java,enums,Java,Enums,假设我有带有3个声明的enumAccessRole: public Enum AccessRole { Admin, User, ReadOnly; } 我使用这个枚举的序数值来表示“分层”访问角色的概念。比如说, if (currentRole.ordinal() < otherRole.ordinal()) { //We know currentRole has more user rights than otherRole, because it's

假设我有带有3个声明的enum
AccessRole

public Enum AccessRole
{
    Admin,
    User,
    ReadOnly;
}
我使用这个枚举的序数值来表示“分层”访问角色的概念。比如说,

if (currentRole.ordinal() < otherRole.ordinal())
{
    //We know currentRole has more user rights than otherRole, because it's ordinal is smaller.
}
if(currentRole.ordinal()
我不以序号的任何权限为基础,但在必要时使用序号对枚举值进行排序和比较(例如,在用户界面中,按序号将所有可能的访问角色从“多权限”排序为“有限权限”)

这很好,但我担心这还不清楚。如果任何其他开发人员在枚举的底部插入新的accessrole,而不是按正确的顺序插入,那么整个系统都会一团糟


有什么办法解决这个问题吗?这会对枚举声明施加一个顺序,但在代码语义上要明确顺序是重要的/正在使用的?

如何向枚举添加一个整数属性,并记录它用于维护角色层次结构。这也允许在同一级别上定义两个角色。

您应该关心。开发人员通常认为枚举的顺序并不重要

然而,添加另一个人工序号只会让事情变得更糟,因为现在您必须注意数字是不同的,而新排序的含义仍然不清楚

我认为在枚举中移动特权检查会有所帮助。因此,在枚举中有一个如下所示的方法:

public boolean includes(Role otherRole){
    return (this.ordinal() < otherRole.ordinal())
}
public boolean includes(角色otherRole){
返回(this.ordinal()

现在可以添加测试了。而且每一位身价不凡的开发人员都会明白,更改枚举中的事物顺序实际上是业务逻辑的改变。

虽然枚举顺序通常不被认为是重要的,但我处理这种情况的方法(如果它确实重要)是在源代码中添加一条显著的注释

当然,你不能防止程序员在没有阅读注释的情况下修改你的代码。但另一方面:

  • 他们可能会以其他方式破坏您的代码,并且

  • 最终,如果他们忽略了你的评论并因此破坏了代码,他们应该承担责任


没有迹象表明OP需要同一级别上的多个元素,因此这确实让问题变得更糟。我认为添加数字没有任何问题,它们不必相同,而且它们确实可以用于强制执行除枚举声明顺序之外的顺序。@Jenschauder,我没有提到这是一项要求,这更多的是关于使用integer属性的副作用的通知。我同意,不过我也会将角色检查移到enum类中,就像@jens schauder建议的那样。否则,枚举中的注释可能很容易丢失。我不确定这一条。当关于“角色X何时包含角色Y?”的策略从使用序数变为其他策略时,这非常有用。但这只是继续使用序数。这是如何解决最初的问题的?它将序号权限的使用放在了枚举中,再加上测试,很明显枚举的顺序是相关的。为什么你认为添加另一个顺序是“人为的”和“使事情变得更糟”?我看到两个优点。第一种方法是强制其他开发人员在创建新枚举时输入一个值,这将使他们非常清楚它的含义。第二是增加了灵活性,即实际的源代码顺序并不重要。我不是说你错了!我要你解释为什么你认为我错了。你不需要的灵活性是一件坏事。与2相反:没有明确的顺序,它就更不明显了?计数器3:User(23)告诉我一整本书,因为enum有一个名为“roleLevel”的变量,带有适当的setter和getter以及文档。这个变量是在枚举本身的源代码中定义的。