- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
使用 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()
的所有用法,以及完成四项任务的大量重构工作:
ordinal()
到每个枚举值。 int toInteger()
。static EnumClassName fromInteger(int v)
来“反序列化”外部值ordinal()
的所有引用以使用新的 toInteger()
和 fromInteger()
方法。关于java - 为 enum.ordinal 生成编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40850737/
我不明白为什么这甚至可以编译。我尝试过不同的格式,它们似乎都有效。 为什么有一个 enum of enum of enum of.. 是合法的? interface I { enum E im
我有大型数据库(数百万行),我正在尝试为 2 个字段的数据类型做出最佳选择。我制作的大部分内容都是 varchar 或 INT。但是,我想知道 Enum 是否是最好的方法的 2 个字段。 字段 1第一
我是 C++ 新手,我想知道是否有人可以帮助我理解原因 enum difficulty { NOVICE, EASY, NORMAL, HARD, UNBEATABLE }; difficulty m
从 native 代码强制转换(在 C++/CLI 中)的正确方法是什么 enum到托管代码enum其中包含相同的 enum值(value)观?与使用 C# 的强制转换方式有什么区别,例如 (int)
我有以下枚举 [Flags] public enum WeekDays { Monday = 1, Tuesday = 2, Wednesday = 4, Thursd
我刚刚学习 Java 中的枚举。当我运行下面的代码时,我收到一个错误,我也在下面重现该错误。基本上,我的问题是:当我在枚举中定义一个方法,并且在该方法中我想检查枚举的值以便我可以根据该值执行某些操作时
我想要一些语法糖来打开 Enum .当然,一个if else块按预期工作: @enum Fruit apple=1 orange=2 kiwi=3 function talk1(fruit::Frui
我试图在 Enum.each 的函数内为变量设置一个值,但在循环结束时,变量为空,我不知道为什么会出现这种行为。 代码: base = "master" candidates = ["stream",
This question already has answers here: Is there a way to use existing structs as enum variants? (2个
我想让 Java 中的枚举器具有其他枚举作为属性。 public enum Direction { Up(Down), Down(Up), Left(Right), R
我有一个包含两种不同可能“类型”的枚举和一个可以返回其中任何一种的函数,封装在 Option 中: enum Possibilities { First(i32), Second(St
我刚刚注意到 pyhton 中 Enum+defaultdict 的一个非常奇怪的行为。我定义了一个这样的枚举,它收集了一些默认词典: from enum import Enum from colle
我想在运行时从配置文件生成一些类型。为简单起见,假设我已经将数据加载为 Python 字典: color_values = dict(RED = 1, YELLOW = 2, GREEN = 3) 我
我想创建一个方法,在传入参数的任何枚举类上实现 valueOf(并包装一些专门的错误/缺失名称代码)。所以基本上,我有几个枚举,例如: enum Enum1{ A, B, C } enum Enum2
我有一个user数据库表: CREATE TABLE IF NOT EXISTS `user` ( `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
这是我的 JPA @Repository,在这里我们可以得到 list与 findByFullNameContaining(String query) - 通过在查询中提供 fullName 的子字符
(也在这里打开了一个问题:https://github.com/square/moshi/issues/768 但被要求打开一个stackoverflow问题)我正在编写一个通用适配器来转换带有枚举值
请帮助找到以下情况的最佳方法: 有一个表,大约有 20 列。 每列都有自己的短名称、全名称和类型(数字或字符串)。 每个列类型都可以有自己的运算符 - 例如,字符串 - 包含、等于;数字 - 更多、更
如果我在 python 中按功能创建了 enum.Enum(本例中为 3.7),如何从中检索类的名称? import enum def print_the_enum_class_name(some_e
我正在编写一个与第 3 方程序交互的程序。这个第 3 方程序允许用户制作可以运行在第 3 方程序中进行的步骤记录的按钮。 但! 这些按钮还可以运行用户定义的批处理文件。因此,我使用此功能通过创建文件并
我是一名优秀的程序员,十分优秀!