当前位置:  开发笔记 > 编程语言 > 正文

考虑出现在许多枚举中出现的方法

如何解决《考虑出现在许多枚举中出现的方法》经验,为你挑选了1个好方法。

我有几个带有name属性的枚举和一个byName大致类似于所有这些的方法:

public static Condition byName(String name) throws NotFoundException {
    for (Condition c : values()) {
        if (c.name.equals(name)) {
            return c;
        }
    }

    throw new NotFoundException("Condition with name [" + name + "] not found");
}

由于该byName方法在不同的枚举中重复,因此我想将其分解在一个地方并避免重复的代码.

然而:

枚举不能扩展抽象类

具有默认方法的Java8接口无法访问该values()方法

我知道这可能是用AspectJ完成的,但是我宁愿不为这样简单的东西引入编译时编织,而Spring AOP(我手边有这个是Spring项目)只允许绑定现有的方法和不添加新的.

任何其他可行的解决方案,为枚举添加常用方法?



1> Yaroslav Sta..:

这是我在同样情况下所做的事情:

public interface EnumWithNames {
    String getName();

    static  E byName(Class cls, String name) {
        for (E value : cls.getEnumConstants()) {
            if (Objects.equals(value.getName(), name)) return value;
        }
        throw new IllegalArgumentException("cannot identify " + cls.getName() + " value by name " + name);
    }
}

public enum Condition implements EnumWithNames {
    private String name;
    ...

    @Override
    public String getName() { return name; }
}

当我需要通过名字找到枚举值时,我打电话给:

Condition c = EnumWithNames.byName(Condition.class, "Name 1");

注意cls.getEnumConstants()values().相同.


将`E`声明为`&EnumWithNames>`不允许调用`values()`方法,但是它阻止调用者传递一个非-enum`类型,此方法不会工作.
你甚至可以要求`E`也是一个Enum:`&EnumWithNames>`.这将允许使用`values()`调用.
推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有