Rai*_*baz 5 java enums spring java-8
我有几个带有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");
}
Run Code Online (Sandbox Code Playgroud)
由于该byName
方法在不同的枚举中重复,因此我想将其分解在一个地方并避免重复的代码.
然而:
values()
方法我知道这可能是用AspectJ完成的,但是我宁愿不为这样简单的东西引入编译时编织,而Spring AOP(我手边有这个是Spring项目)只允许绑定现有的方法和不添加新的.
任何其他可行的解决方案,为枚举添加常用方法?
这是我在同样情况下所做的事情:
public interface EnumWithNames {
String getName();
static <E extends EnumWithNames> E byName(Class<E> 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; }
}
Run Code Online (Sandbox Code Playgroud)
当我需要通过名字找到枚举值时,我打电话给:
Condition c = EnumWithNames.byName(Condition.class, "Name 1");
Run Code Online (Sandbox Code Playgroud)
注意cls.getEnumConstants()
与values()
.相同.