这是您正在寻找的另一个演示。此解决方案与以前的解决方案之间的区别在于,此解决方案更通用且可重用。这实际上超出了最初的问题,展示了这种方法的一些其他好处。所以你可能只是评论你不需要的位。我还附上了一个单元测试来演示该行为。
所以基本上要查找名称Apple
或APPLE
在这些枚举之一中只写:
FruitVeg<?> fvg = getEnum("APPLE", Fruits.class, Vegetables.class);
FruitVeg<>
是一个界面,它也允许在 Enum 内部点击,这个界面允许用下面的枚举做一些非常有趣的事情。以下是您可以做的一些事情:
Enum.valueOf(fvg.getDeclaringClass(), fvg.name())
: 返回枚举值,例如APPLE
fvg.getRaw()
: 返回枚举值,例如APPLE
fvg.name()
: 返回枚举的字符串名称,例如APPLE
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;
}