对枚举的思考

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。