gpt4 book ai didi

java - ENUM 开关中的空值处理

转载 作者:行者123 更新时间:2023-11-30 08:43:33 25 4
gpt4 key购买 nike

我注意到关于 switch on 枚举的 null 有一个潜在的陷阱。

不对称是关于枚举值的可能范围与 switch 接受的值范围。

public class SwitchEnumPitfall {
private static enum MyEnum { FOO, BAR }
public static void main(final String... args) {
final MyEnum e = null;
switch (e) { // throws NullPointerException
//case null: System.err.println("null"); break; // wouldn't compile
case FOO: System.err.println("FOO"); break;
case BAR: System.err.println("BAR"); break;
}
}
}

要打开的 int 值是通过调用方法 Enum.ordinal() 确定的。以下代码演示了序数从零开始。

 public enum EnumOrdinals {
FOO, BAR;
public static void main(final String... args) {
System.out.println(FOO.ordinal());
System.out.println(BAR.ordinal());
}
}

这意味着,将 null 映射到 0 不是一个好主意。第一个枚举值上的开关将与 null 无法区分。也许从 1 开始计算枚举的序数是个好主意。但是它还没有这样定义,而且这个定义不能改变。

为什么没有这样定义呢?

最佳答案

这很简单。无论在哪里取消引用 null,都会抛出 NullPointerException。只有使用 if (x != null) 明确检查的显式方法才能避免 null 被取消引用。如果 switch 会检查其枚举参数是否为 null 并处理这种特殊情况,那将违反 Java 的哲学。

但是,Java 不仅仅是 Java 编程语言。它也是 Java 虚拟机。你也可以在上面运行其他编程语言。从 0 开始计数枚举的决定使得在 JVM 上运行的 Java 枚举隐含地与可能的脚本语言不兼容,这些语言将 null 视为零并从 1 开始其枚举序数。

关于java - ENUM 开关中的空值处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34205436/

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