首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为enum.ordinal生成编译器警告

为enum.ordinal生成编译器警告
EN

Stack Overflow用户
提问于 2016-11-28 18:05:29
回答 2查看 160关注 0票数 4

工作爪哇7+ ..。假设我们创建了一个枚举:

代码语言:javascript
复制
enum Foo{ FOO, BAR }

然后是Foo.FOO.ordinal() == 0。但是,如果我重新订购了enum,请说:

代码语言:javascript
复制
enum Foo{ BAR, FOO }

然后是Foo.FOO.ordinal() == 1。这对大多数人来说是令人惊讶的,因为他们觉得重新排序字段是一种“安全”的操作。在大多数情况下,Java建议不使用enum.ordinal()并不奇怪。有很多可供选择的方法,最明显的(以及自文档化的)将每个枚举值与int关联起来。

不幸的是,我公司的一些人没有收到备忘录,我们的许多旧代码都在各地使用.ordinal()方法,这在根本上取决于int和枚举值之间的关联。当我有时间的时候,我会浏览并重构,但是它并不会阻止新代码使用.ordinal(),这会引入潜在的无法追踪的but。

所以!假设我有一个与它相关的结构的枚举。我是否可以将.ordinal()标记为不安全,以便如果有人使用(例如) Foo.FOO.ordinal(),就会生成编译器警告?

我满足于为此目的使用外部包,但如果它们不是太模糊的话,我更愿意使用它。

EN

回答 2

Stack Overflow用户

发布于 2016-11-28 19:22:28

enum的全部目的是将代码从基础值中分离出来,而使用ordinal()就不能达到这个目的。

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

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

  1. 修改每个枚举声明,将一个独立于ordinal()的整数值永久不变地附加到每个枚举值。
  2. 在每个枚举声明中,添加一个返回整数值的方法int toInteger()
  3. 在每个枚举声明中,添加一个方法static EnumClassName fromInteger(int v)来“反序列化”外部值。
  4. 重构对ordinal()的所有引用,以使用新的toInteger()fromInteger()方法。
票数 1
EN

Stack Overflow用户

发布于 2017-03-06 19:24:24

这个XPath PMD规则怎么样?

//PrimaryPrefix/Nameends with(@Image,'.ordinal')

只需将其放在规则元素中的规则集XML文件中,如下所示:

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40850737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档