结合枚举并使用getter返回指定的枚举

dal*_*awh 8 java enums

假设我有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

这是您正在寻找的另一个示范.此解决方案与以前的解决方案之间的区别在于,此解决方案更通用且可重复使用.事实上这超出了原来的问题,显示了这种方法的一些其他好处.所以你可能只是评论你不需要的位.我还附上一个单元测试来证明行为.

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

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)


Ste*_* P. 0

听起来您正在寻找的是能够将继承应用于enums,但这在 java 中是不可能的,因为enums隐式扩展java.lang.Enum和 java 不支持多重继承。

尽管如此,我认为使用“嵌套枚举”可以解决您的问题。通过嵌套,我的意思是实现一个接口来解决多重继承问题。链接中的答案有几种不同的方法,我认为其中一种就足够了。