让枚举声明的顺序变得不好是不好的做法?

时间:2014-12-26 10:59:44

标签: java enums

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

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.
}

我不基于序数的任何权限,但是我在必要时使用序数对枚举值进行排序和比较(例如,在用户界面中,按顺序从“许多权利”中排序所有可能的访问角色“有限的权利”)。

这很好用,但我担心这个不太清楚。如果任何其他开发人员在枚举的底部插入一个新的accessrole而不是在正确的序号,整个系统都搞砸了。

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

3 个答案:

答案 0 :(得分:2)

你是对的。开发人员通常认为枚举顺序并不重要。

然而,添加另一个人为的序数只会让事情变得更糟,因为现在你已经注意到数字是不同的,新秩序的含义仍然不明确。

我认为有助于在Enum中移动支票权限。所以你的枚举中的方法看起来像这样:

public boolean includes(Role otherRole){
    return (this.ordinal() < otherRole.ordinal())
}

现在您可以添加测试。每个值得她花钱的开发人员都会理解,改变枚举中的事物顺序实际上是业务逻辑的变化。

答案 1 :(得分:2)

虽然枚举的顺序通常不是 认为是重要的,但我处理这种情况的方式(它确实重要)将在源代码中加入一个突出的注释。

当然,你不能防止程序员修改(屠夫!)你的代码而不阅读评论。但另一方面:

  • 他们有责任以其他方式屠杀您的代码,

  • 最终,如果他们忽略了您的评论并因此违反了代码,他们应该承担责任。

答案 2 :(得分:1)

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