对枚举的思考
Reflection on Enums
我目前正在为我的 Java 库编写的方法之一将任意枚举类型的数组作为其唯一参数。如果其中任何一个非空,我就可以访问代表该枚举类型的 java.lang.Class
实例,它可能是也可能不是 public 类型。 (如果它们都是空的,那么在这种情况下无论如何都没有任何意义。)我如何获得枚举类型的可能值的数量?当枚举 class 不是 public 时,我当前使用的方法 - Array.getLength(clazz.getMethod("values").invoke(null));
- 失败。我该如何解决这个问题?
从 Class
对象获取枚举常量数组的最简单方法是
clazz.getEnumConstants();
要查找枚举常量的数量,您可以向其中添加 .length
。
如果您想从枚举实例中获取枚举常量数组,重要的是要做到
e.getDeclaringClass().getEnumConstants();
而不是
e.getClass().getEnumConstants();
以下示例说明了这样做的原因:
private enum Colour {
WHITE,
BLUE {
@Override
public String toString() {
return "blue";
}
}
}
public static void main(String[] args) throws Exception {
System.out.println(Arrays.toString(Colour.BLUE.getClass().getEnumConstants()));
System.out.println(Arrays.toString(Colour.WHITE.getClass().getEnumConstants()));
System.out.println(Arrays.toString(Colour.BLUE.getDeclaringClass().getEnumConstants()));
}
这个程序输出
null
[WHITE, blue]
[WHITE, blue]
这里发生的事情是,为了覆盖 BLUE
常量的方法 toString
,创建了 Colour
的子 class。这意味着 Colour.BLUE.getClass()
做 而不是 return Colour.class
,所以 Colour.BLUE.getClass().getEnumConstants()
return 是 null
。此问题不适用于 WHITE
,因为 WHITE
不需要额外的 class。
我目前正在为我的 Java 库编写的方法之一将任意枚举类型的数组作为其唯一参数。如果其中任何一个非空,我就可以访问代表该枚举类型的 java.lang.Class
实例,它可能是也可能不是 public 类型。 (如果它们都是空的,那么在这种情况下无论如何都没有任何意义。)我如何获得枚举类型的可能值的数量?当枚举 class 不是 public 时,我当前使用的方法 - Array.getLength(clazz.getMethod("values").invoke(null));
- 失败。我该如何解决这个问题?
从 Class
对象获取枚举常量数组的最简单方法是
clazz.getEnumConstants();
要查找枚举常量的数量,您可以向其中添加 .length
。
如果您想从枚举实例中获取枚举常量数组,重要的是要做到
e.getDeclaringClass().getEnumConstants();
而不是
e.getClass().getEnumConstants();
以下示例说明了这样做的原因:
private enum Colour {
WHITE,
BLUE {
@Override
public String toString() {
return "blue";
}
}
}
public static void main(String[] args) throws Exception {
System.out.println(Arrays.toString(Colour.BLUE.getClass().getEnumConstants()));
System.out.println(Arrays.toString(Colour.WHITE.getClass().getEnumConstants()));
System.out.println(Arrays.toString(Colour.BLUE.getDeclaringClass().getEnumConstants()));
}
这个程序输出
null
[WHITE, blue]
[WHITE, blue]
这里发生的事情是,为了覆盖 BLUE
常量的方法 toString
,创建了 Colour
的子 class。这意味着 Colour.BLUE.getClass()
做 而不是 return Colour.class
,所以 Colour.BLUE.getClass().getEnumConstants()
return 是 null
。此问题不适用于 WHITE
,因为 WHITE
不需要额外的 class。