【问题标题】:How to re-use duplicate code with Enums in Java 8?如何在 Java 8 中通过枚举重用重复代码?
【发布时间】:2023-03-24 15:56:01
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java generics enums


【解决方案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"));
}

【讨论】:

  • 谢谢,这正是我想要的。
猜你喜欢
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多