假设我有2种不同的枚举:水果和蔬菜.
public static enum Fruits{
APPLE ("Apple"),
PEAR ("Pear");
//constructor
//getName()
...
}
public static enum Vegetables{
CARROT ("Carrot"),
LETTUCE ("Lettuce");
//constructor
//getName()
...
}
Run Code Online (Sandbox Code Playgroud)
我在JComboBox中显示所有这些.在某人选择了某些内容后,我想使用getter方法来获取Enum.
对于单个枚举,我会做类似的事情:
public static Fruits getEnum(String name) {
for(Fruits fruit: Fruits.values()) {
if(name.equals(fruit.getName())) {
return fruit;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
任何想法返回类型是什么?我尝试使用Enum而不是Fruits.当我这样做时,我似乎无法访问getName()方法.
hus*_*ayt 18
这是您正在寻找的另一个示范.此解决方案与以前的解决方案之间的区别在于,此解决方案更通用且可重复使用.事实上这超出了原来的问题,显示了这种方法的一些其他好处.所以你可能只是评论你不需要的位.我还附上一个单元测试来证明行为.
所以基本上寻找名称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():例如Apple
fvg.getDeclaringClass(): 返回 Class<Enum<?>>例如class ox.dummy.dummyTest $ Fruits
fvg.getClass():class ox.dummy.dummyTest $ Fruits 返回 Class<?>
EnumSet.allOf(fvg.getDeclaringClass())):例如[APPLE,PEAR]
这是代码
@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;
}
Run Code Online (Sandbox Code Playgroud)