这是您正在寻找的另一个演示。此解决方案与以前的解决方案之间的区别在于,此解决方案更通用且可重用。这实际上超出了最初的问题,展示了这种方法的一些其他好处。所以你可能只是评论你不需要的位。我还附上了一个单元测试来演示这种行为。
所以基本上要在这些枚举之一中查找名称 Apple 或 APPLE 只需写:
FruitVeg<?> fvg = getEnum("APPLE", Fruits.class, Vegetables.class);
FruitVeg<> 是一个接口,它也允许在 Enum 内部点击,这个接口允许用下面的枚举做一些非常有趣的事情。以下是您可以用它做的一些事情:
Enum.valueOf(fvg.getDeclaringClass(), fvg.name()): 返回枚举值 例如苹果
fvg.getRaw(): 返回枚举值 例如苹果
fvg.name() : 返回枚举的字符串名称 例如苹果
fvg.getFriendlyName() :例如苹果
fvg.getDeclaringClass() : 返回 Class<Enum<?>> 例如类 ox.dummy.dummyTest$Fruits
fvg.getClass() : class ox.dummy.dummyTest$Fruits 返回 Class<?>
EnumSet.allOf(fvg.getDeclaringClass())) :例如[苹果,梨]
这里是代码
@Test
public void doSimpleTest() throws Exception {
FruitVeg<?> fvg = getEnum("APPLE", Fruits.class, Vegetables.class);
log.info("{} : {} : {} : {} : {}", fvg.name(), fvg.getFriendlyName(), fvg.getClass(), fvg.getDeclaringClass(), EnumSet.allOf(fvg.getDeclaringClass()));
log.info("get enum: {} ", Enum.valueOf(fvg.getDeclaringClass(), fvg.name()));
}
public interface FruitVeg<T extends Enum<T>> {
String name();
String getFriendlyName();
Class<T> getDeclaringClass();
T getRaw();
}
enum Fruits implements FruitVeg<Fruits> {
APPLE("Apple"),
PEAR("Pear");
Fruits(String friendlyName) {
this.friendlyName = friendlyName;
}
private final String friendlyName;
@Override
public String getFriendlyName() {
return friendlyName;
}
@Override
public Fruits getRaw() {
return this;
}
}
enum Vegetables implements FruitVeg<Vegetables> {
CARROT("Carrot"),
LETTUCE("Lettuce");
Vegetables(String friendlyName) {
this.friendlyName = friendlyName;
}
private final String friendlyName;
@Override
public String getFriendlyName() {
return friendlyName;
}
@Override
public Vegetables getRaw() {
return this;
}
}
public static FruitVeg<?> getEnum(String name, Class<? extends FruitVeg<?>>... fvgClasses) {
for (Class<? extends FruitVeg<?>> fruitVegCLass : Arrays.asList(fvgClasses)) {
for (FruitVeg<?> fvg : fruitVegCLass.getEnumConstants()) {
if (name.equals(fvg.name()) || name.equals(fvg.getFriendlyName())) {
return fvg;
}
}
}
return null;
}