当前位置: 首页 > 知识库问答 >
问题:

如何重用重复的代码与ENums在Java8?

怀飞扬
2023-03-14

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

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

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

与此同时,我让我的代码工作,但复制真的困扰着我,我觉得它可以做得更好。如果我们继续添加新的枚举器,那么重复只会变得更糟。

共有1个答案

席乐童
2023-03-14

您不能让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"));
}
 类似资料:
  • 问题内容: 我有很多实现此接口的枚举: 一个典型的例子是: 可以想象,这些方法在CodableEnum的所有实现中实际上是相同的。我想消除这种重复,但坦率地说不知道如何做。我尝试使用如下类: 但这实际上是没有用的,因为: 枚举不能扩展类 枚举的元素(SKYPE,GOOGLE_TALK等)无法扩展类 我无法提供getByCode()的默认实现,因为DefaultCodableEnum本身不是枚举。我

  • 我想在curl代码中加入一个变量,我该怎么做?我尝试了以下代码,但没有为我工作,这是我的代码

  • 我在执行时出现了这个错误: 我错过了什么?

  • 问题内容: 我正在尝试为Java创建一个小的功能性编程库(只是为了解决自己的问题)。虽然定义高阶函数为S,S和就是我所遇到的这个问题:需要收集的功能,并返回相同类型的具有几乎相同的实现的集合,但必须重新界定为每个数据结构-s,s和s。 例如,这是s和s 的函数的实现: 一个函数: 如从这个例子可以看出,对于实施方式中的主体和几乎相同。 有喜欢很多很多的功能,并在我的图书馆,每一类又是对每种类型我很

  • 你好,我正在使用以下函数将数据集中的所有分类值转换为数字,但我想将其转换为使用OneHotEncoder,如何做到这一点? 谢谢

  • 我已经创建了一个CodeStar项目(PythonWebService模板作为起点),并且正在使用vscode对其进行编辑。 到目前为止,我已经自定义生成的项目有两个lambdas。结构如下: 它使用“sam本地启动api”并使用AWS仪表板进行测试。 但是,除了在每个lambda上复制粘贴“. py”文件作为模块使用之外,我没有设法重用“lambda1”和“lambda2”之间的代码。尝试编辑r