gpt4 book ai didi

java - 如何在 Java 8 中通过 Enum 重用重复代码?

转载 作者:行者123 更新时间:2023-11-30 06:20:46 25 4
gpt4 key购买 nike

我的应用程序中有 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,它是每个枚举的类。

第一个方法将打印枚举类的所有可能值,如果给定的字符串可以放入枚举类,第二个方法将返回 true/false。

我尝试实现一个实现这些方法的接口(interface),但我无法使用values(),因为它不是Enum API的一部分。我无法将这些方法与每个类具体关联起来,因为这些方法是公共(public)静态的。我无法创建自定义类并扩展 Enum 来扩展它,因为 Java 不支持多重继承。

与此同时,我的代码正在运行,但重复确实让我烦恼,我觉得它可以更好。如果我们继续添加新的枚举器,那么重复只会变得更糟。

最佳答案

您不能让 Enum 类实现接口(interface),但您可以在每个枚举上保留对对象的静态引用,并且这些对象可以实现公共(public)接口(interface)。这将减少重复量。

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"));
}

关于java - 如何在 Java 8 中通过 Enum 重用重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48198823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com