gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:33:22 24 4
gpt4 key购买 nike

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

enum Foo{ FOO, BAR }

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

enum Foo{ BAR, FOO }

然后 Foo.FOO.ordinal() == 1。这对大多数人来说是令人惊讶的,因为他们认为重新排序字段是一种“安全”操作。在大多数情况下,Java 反对 使用 enum.ordinal() 也就不足为奇了。有很多替代方案,最明显的(并且 self 记录地)将每个枚举值与一个 int 相关联。

不幸的是,我公司的一些人没有得到备忘录,我们的很多旧代码到处都使用 .ordinal() 方法,这从根本上取决于int 和枚举值。当我有时间时,我会检查并重构,但这并不能阻止新代码使用 .ordinal(),这会引入潜在的无法追踪的错误。

所以!假设我有一个枚举,它有很多关联的结构。我能否以某种方式将 .ordinal() 标记为 不安全,这样如果有人使用(比如说)Foo.FOO.ordinal() 编译器会产生警告吗?

我很乐意为此目的使用外部包,但如果它们不太晦涩,我会更喜欢它。

最佳答案

enum 的全部意义在于将代码与底层值分离,使用 ordinal() 达不到目的。

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

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

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

关于java - 为 enum.ordinal 生成编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40850737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com