以多态方式将 Java 枚举值转换为字符串列表

2022-09-03 00:34:43

我有一些帮助器方法,可以将枚举值转换为适合由HTML元素显示的字符串列表。我想知道是否有可能将这些重构为单个多态方法。<select>

这是我现有的方法之一的示例:

/**
 * Gets the list of available colours.
 * 
 * @return the list of available colours
 */
public static List<String> getColours() {
  List<String> colours = new ArrayList<String>();

  for (Colour colour : Colour.values()) {
    colours.add(colour.getDisplayValue());  
  }

  return colours;
}

我对Java泛型还很陌生,所以我不确定如何将泛型枚举传递给该方法,并在for循环中使用该枚举。

请注意,我知道所讨论的枚举都将具有该方法,但不幸的是,它们不共享定义它的通用类型(我无法介绍一个),所以我想必须以反思的方式访问它...?getDisplayValue

提前感谢您的任何帮助。


答案 1

使用 Class#getEnumConstants() 很简单:

static <T extends Enum<T>> List<String> toStringList(Class<T> clz) {
     try {
        List<String> res = new LinkedList<String>();
        Method getDisplayValue = clz.getMethod("getDisplayValue");

        for (Object e : clz.getEnumConstants()) {
            res.add((String) getDisplayValue.invoke(e));

        }

        return res;
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}

这不是完全的类型安全,因为你可以在没有方法的情况下有一个枚举。getDisplayValue


答案 2

您可以将此方法粘贴到某些实用程序类中:

public static <T extends Enum<T>> List<String> getDisplayValues(Class<T> enumClass) {
    try {
        T[] items = enumClass.getEnumConstants();
        Method accessor = enumClass.getMethod("getDisplayValue");

        ArrayList<String> names = new ArrayList<String>(items.length);
        for (T item : items)
            names.add(accessor.invoke(item).toString()));

        return names;
    } catch (NoSuchMethodException ex) {
        // Didn't actually implement getDisplayValue().
    } catch (InvocationTargetException ex) {
        // getDisplayValue() threw an exception.
    }
}

资料来源:检查枚举