java - 组合枚举并使用 getter 返回指定的枚举

标签 java enums

假设我有两组不同的枚举:水果和蔬菜。

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() 方法。

最佳答案

这是您正在寻找的另一个演示。此解决方案与以前的解决方案之间的区别在于,此解决方案是更通用且可重用的模式。这实际上超出了最初的问题,展示了这种方法的一些其他好处。所以你可能只评论你不需要的部分。我还附加了一个单元测试来演示该行为。

所以基本上是寻找名称 AppleAPPLE在其中一个枚举中只需写:

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$Fruits

  • fvg.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/

相关文章:

java - 向空的 JCombobox 添加水印

java - 如何使用 javafx 将多行文本添加到文本区域?

C# "Enum"序列化 - 反序列化为静态实例

Java:获取枚举的 ExceptionInInitializerError

Grails 2.5 :domainObj. validate() 方法在 domainObj.properties=params 时返回 false

java - 降低时间复杂度

swift - 是否可以将 Enum 值与 'if' 语句进行比较?

java - JDBC 访问被拒绝错误

java - 如何配置 Jackson 以反序列化包含在基类上使用 @JsonTypeInfo 和 JsonSubTypes 注释的命名类型的列表?

java - 等待 systemd 直到服务套接字可用,然后启动依赖的服务