我有几个带有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项目)只允许绑定现有的方法和不添加新的.
任何其他可行的解决方案,为枚举添加常用方法?
这是我在同样情况下所做的事情:
public interface EnumWithNames { String getName(); staticE 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()
.相同.