我的应用程序中有3个枚举器类。所有3个类都有2个重复的方法,我们想要在每个实现的枚举中使用。
public static List<String> supported(){
return Arrays.asList([[EnumClass]].values())
.stream().map(Enum::name).collect(Collectors.toList());
}
public static boolean contains(String value){
boolean response = false;
try {
response = value != null ? [[EnumClass]].valueOf(value.trim().toUppercase()) != null : false;
} catch (Exception e){
LOGGER.error("ERROR: {}", e);
}
return response;
}
这些方法中唯一改变的部分是 EnumClass ,它是每个枚举的类。
第一种方法将打印枚举类的所有可能值,如果给定的String可以作为枚举类,则第二种方法将返回true / false。
我尝试实现一个实现这些方法的接口,但我不能使用values(),因为它不是Enum API的一部分。我不能特别将方法与每个类相关联,因为这些方法是公共静态的。我无法创建自定义类并扩展Enum以扩展它,因为Java不支持多重继承。
与此同时,我的代码工作正常,但复制真的困扰我,我觉得它可能会更好。如果我们继续添加新的枚举器,那么复制将变得更糟。
答案 0 :(得分:1)
您不能让Enum类实现接口,但您可以在每个枚举上保持对对象的静态引用,并且这些对象可以实现公共接口。这将减少重复的数量。
public static class EUtils<E extends Enum<E>> {
private final E[] values;
private Function<String,E> valueOf;
public EUtils(E[] values, Function<String,E> valueOf) {
this.values = values;
this.valueOf = valueOf;
}
public List<String> supported(){
return Arrays.asList(values)
.stream().map(Enum::name).collect(Collectors.toList());
}
public boolean contains(String value){
boolean response = false;
try {
response = value != null ? valueOf.apply(value.trim().toUpperCase()) != null : false;
} catch (Exception e){
e.printStackTrace();
}
return response;
}
}
private enum Directions {
LEFT,
RIGHT;
public static EUtils<Directions> enumUtils = new EUtils<>(Directions.values(),Directions::valueOf);
}
public static void main(String[] args) {
System.out.println(Directions.enumUtils.contains("LEFT"));
System.out.println(Directions.enumUtils.contains("X"));
}