假设我有两组不同的枚举:水果和蔬菜。
public static enum Fruits{
APPLE ("Apple"),
PEAR ("Pear");
//constructor
//getName()
...
}
public static enum Vegetables{
CARROT ("Carrot"),
LETTUCE ("Lettuce");
//constructor
//getName()
...
}
我在 JComboBox 中显示所有这些。在有人选择了一些东西之后,我想使用一个 getter 方法来取回 Enum。
对于单个枚举,我会做类似的事情:
public static Fruits getEnum(String name) {
for(Fruits fruit: Fruits.values()) {
if(name.equals(fruit.getName())) {
return fruit;
}
}
return null;
}
知道返回类型是什么吗?我尝试使用 Enum 而不是 Fruits。当我这样做时,我似乎无法访问 getName() 方法。
最佳答案
这是您正在寻找的另一个演示。此解决方案与以前的解决方案之间的区别在于,此解决方案是更通用且可重用的模式。这实际上超出了最初的问题,展示了这种方法的一些其他好处。所以你可能只评论你不需要的部分。我还附加了一个单元测试来演示该行为。
所以基本上是寻找名称 Apple
或 APPLE
在其中一个枚举中只需写:
FruitVeg<?> fvg = getEnum("APPLE", Fruits.class, Vegetables.class);
FruitVeg<>
是一个接口(interface),它还允许在枚举内部点击,这个接口(interface)允许用下面的枚举做一些非常有趣的事情。以下是您可以用它做的一些事情:
Enum.valueOf(fvg.getDeclaringClass(), fvg.name())
: 返回枚举值 例如苹果fvg.getRaw()
: 返回枚举值 例如苹果fvg.name()
: 返回枚举的字符串名称 例如苹果fvg.getFriendlyName()
:例如苹果fvg.getDeclaringClass()
: 返回Class<Enum<?>>
例如类 ox.dummy.dummyTest$Fruitsfvg.getClass()
: 类 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;
}
关于java - 组合枚举并使用 getter 返回指定的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17646335/