处理相同功能但实现相同接口的不同枚举的通用方法

Generic way to deal with same function but different enums that implements the same interface

我有一个实现相同接口的enums列表,例如:

public enum MyEnum implements MyInterface {
    ABC(TABLE_NAME),
    XYZ(TABLE_NAME);
    ...

    private final String tableName;


    MyEnum(String tableName) {
        this.tableName = tableName;
    }

    public String getTableName() {
        return tableName;
    }
}

MyInterface 会是这样的:

public interface MyInterface {
   String getTableName();
}

从所有 enum 我有(比方说 MyEnumMyEnum2MyEnum3 等等),我必须做同样的事情,那就是读取 table 个名称并对它们进行排序。类似于:

public static List<String> getHeader() {
    List<String> header = new ArrayList<>();
    for (MyEnum a: MyEnum.values()) {
        header.add(a.getTableName());
    }
    Collections.sort(header);
    return header;
}

我想将此方法转换为通用方法,以便我可以将所有 enum 传递给同一个函数:

for (MyEnum a: MyEnum.values()) {

并避免在其中进行 MyEnum 硬编码,避免同一函数的多个副本执行相同的操作。

有什么想法吗?

public static <T extends Enum<T> & MyInterface> List<String> getHeader(Class<T> enumType) {
    List<String> header = new ArrayList<>();
    for (T a: enumType.getEnumConstants()) {
        header.add(a.getTableName());
    }
    Collections.sort(header);
    return header;
}

正如您首先看到的,您正在定义扩展枚举和接口的类型:

<T extends Enum<T> & MyInterface> //这在 return 类型之前并且是为方法的范围定义的

我们还需要枚举 class 来迭代值,我们将其作为参数 Class<T> enumType

休息和你一样

我发现@JAsgarov 的回答有点太难读了,它将它限制为枚举,而不是使用已经存在的接口。

我的解决方案如下所示:在您的界面中引入一个 getValues() 功能,您就完成了。您现在可以将接口的任何枚举值或实例传递给函数。

public enum MyEnum implements MyInterface {
    ABC(TABLE_NAME),
    XYZ(TABLE_NAME);

    private final String tableName;

    MyEnum(String tableName) {
        this.tableName = tableName;
    }

    @Override
    public String getTableName() {
        return tableName;
    }

    @Override
    public MyInterface[] getValues() {
        return values();
    }
}

public static List<String> getHeader(MyInterface interface) {
    List<String> header = new ArrayList<>();
    for (MyInterface a : interface.getValues()) {
        header.add(a.getTableName());
    }
    Collections.sort(header);
    return header;
}

public interface MyInterface {
    String getTableName();

    MyInterface[] getValues();
}