工作爪哇7+ ..。假设我们创建了一个枚举:
enum Foo{ FOO, BAR }然后是Foo.FOO.ordinal() == 0。但是,如果我重新订购了enum,请说:
enum Foo{ BAR, FOO }然后是Foo.FOO.ordinal() == 1。这对大多数人来说是令人惊讶的,因为他们觉得重新排序字段是一种“安全”的操作。在大多数情况下,Java建议不使用enum.ordinal()并不奇怪。有很多可供选择的方法,最明显的(以及自文档化的)将每个枚举值与int关联起来。
不幸的是,我公司的一些人没有收到备忘录,我们的许多旧代码都在各地使用.ordinal()方法,这在根本上取决于int和枚举值之间的关联。当我有时间的时候,我会浏览并重构,但是它并不会阻止新代码使用.ordinal(),这会引入潜在的无法追踪的but。
所以!假设我有一个与它相关的结构的枚举。我是否可以将.ordinal()标记为不安全,以便如果有人使用(例如) Foo.FOO.ordinal(),就会生成编译器警告?
我满足于为此目的使用外部包,但如果它们不是太模糊的话,我更愿意使用它。
发布于 2016-11-28 19:22:28
enum的全部目的是将代码从基础值中分离出来,而使用ordinal()就不能达到这个目的。
您没有这么说,但我怀疑问题发生在Java代码和外部存储之间的接口上,即使用ordinal()将枚举“序列化”成可以存储在文件或数据库中的内容。
我觉得你在这里运气不好。正如@Henry所说,您唯一的选择很可能是使用自定义规则标记ordinal()所有用法的代码分析工具,以及完成四项任务的大量重构工作:
ordinal()的整数值永久不变地附加到每个枚举值。int toInteger()。static EnumClassName fromInteger(int v)来“反序列化”外部值。ordinal()的所有引用,以使用新的toInteger()和fromInteger()方法。发布于 2017-03-06 19:24:24
这个XPath PMD规则怎么样?
//PrimaryPrefix/Nameends with(@Image,'.ordinal')
只需将其放在规则元素中的规则集XML文件中,如下所示:
<rule name="DontUseEnumOrdinal" message="Please no enums ordinal"
class="net.sourceforge.pmd.lang.rule.XPathRule" language="java">
<description>We don't take kindly enum ordinal() round these parts</description>
<priority>3</priority>
<properties>
<property name="xpath">
<value><![CDATA[//PrimaryPrefix/Name[ends-with(@Image, '.ordinal')]]]></value>
</property>
</properties>
<example><![CDATA[MyEnum.MY_VALUE.ordinal(); //is bad
MyEnum.MY_VALUE.index(); //is better]]>
</example>
</rule>https://stackoverflow.com/questions/40850737
复制相似问题