java – 为enum.ordinal生成编译器警告

使用
Java 7 ….假设我们创建一个枚举:

enum Foo{ FOO, BAR }

那么Foo.FOO.ordinal()== 0.但是,如果我重新排序枚举,请说:

enum Foo{ BAR, FOO }

然后Foo.FOO.ordinal()== 1.这对大多数人来说是令人惊讶的,因为他们觉得重新排序字段是一种“安全”的操作.毫无疑问,Java建议在大多数情况下不要使用enum.ordinal().有很多替代方案,最明显(并且自我记录)将每个枚举值与int相关联.

不幸的是,我公司的某些人没有收到备忘录,而且我们的许多旧代码都使用了.ordinal()方法,这取决于int和enum值之间关联的基本方式.当我有时间时,我会经历并重构,但它不会阻止新代码使用.ordinal(),它会引入可能无法追踪的错误.

所以!假设我有一个与它相关的很多结构的枚举.我可以以某种方式将.ordinal()标记为不安全,以便如果有人使用(比方说)Foo.FOO.ordinal(),将生成编译器警告吗?

我满足于为此目的使用外部包,但如果它们不太模糊则更喜欢它.

最佳答案 枚举的重点是将代码与基础值分离,并使用ordinal()来破坏目的.

您没有说,但我怀疑问题出现在Java代码和外部存储之间的接口上,即使用ordinal()将枚举“序列化”为可存储在文件或数据库中的内容.

我觉得你在这里运气不好.正如@Henry所说,你唯一的选择可能是一个代码分析工具,它带有一个自定义规则来标记ordinal()的所有用法,以及一个大规模的重构工作来完成四个任务:

>修改每个枚举声明以不可变地永久地附加一个整数值,独立于ordinal()到每个枚举值.
>对于每个枚举声明,添加一个方法int toInteger(),返回整数值.
>对每个枚举声明,添加一个方法静态EnumClassName fromInteger(int v)来“反序列化”外部值
>重构对ordinal()的所有引用以使用新的toInteger()和fromInteger()方法.

点赞