假设我的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而不是在正确的序号,整个系统都搞砸了。
有什么方法可以解决这个问题吗?这个,对枚举声明施加一个顺序,但在语义代码中明确说明顺序是重要/正在使用?
答案 0 :(得分:2)
你是对的。开发人员通常认为枚举顺序并不重要。
然而,添加另一个人为的序数只会让事情变得更糟,因为现在你已经注意到数字是不同的,新秩序的含义仍然不明确。
我认为有助于在Enum中移动支票权限。所以你的枚举中的方法看起来像这样:
public boolean includes(Role otherRole){
return (this.ordinal() < otherRole.ordinal())
}
现在您可以添加测试。每个值得她花钱的开发人员都会理解,改变枚举中的事物顺序实际上是业务逻辑的变化。
答案 1 :(得分:2)
虽然枚举的顺序通常不是 认为是重要的,但我处理这种情况的方式(它确实重要)将在源代码中加入一个突出的注释。
当然,你不能防止程序员修改(屠夫!)你的代码而不阅读评论。但另一方面:
他们有责任以其他方式屠杀您的代码,
最终,如果他们忽略了您的评论并因此违反了代码,他们应该承担责任。
答案 2 :(得分:1)
如何向Enum添加一个整数属性,并记录它是否用于维护角色的层次结构。这也允许在同一级别定义两个角色。