ENUM开关中的空处理

时间:2015-12-10 15:14:04

标签: java enums

我已经注意到,关于切换枚举的空值存在潜在的陷阱。

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

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开始计算枚举的序数是一个好主意。然而,它没有被定义为这样,并且这个定义不能改变。

为什么没有这样定义?

1 个答案:

答案 0 :(得分:2)

这很简单。无论何处取消引用null,都会抛出NullPointerException。它是唯一显式检查if(x!= null)的显式方法,可以避免null被反转。如果switch将检查其枚举参数是否为null并处理这种特殊情况,那将会破坏Java的哲学。

但是,Java不仅仅是Java编程语言。它也是Java虚拟机。您也可以在其上运行其他编程语言。从零开始计算枚举的决定使得在JVM上运行的Java枚举与可能的脚本语言不一致,这些脚本语言将null视为零,并在1开始它们的枚举。