处理相同功能但实现相同接口的不同枚举的通用方法
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
我有(比方说 MyEnum
、MyEnum2
、MyEnum3
等等),我必须做同样的事情,那就是读取 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();
}
我有一个实现相同接口的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
我有(比方说 MyEnum
、MyEnum2
、MyEnum3
等等),我必须做同样的事情,那就是读取 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();
}