2

我有一些不同的枚举,我想创建一个函数,如果字符串是枚举变量名之一(不确定它是否真的可以理解),它可以查找或不查找。

enum MYENUM {
  ONE,
  TWO;
}

enum MYENUM1 {
  RED,
  GREEN;
}

我想这样做(这只是示例,我的枚举更复杂):

if(isInEnum(MYENUM, "one")) ...
if(isInEnum(MYENUM1, "one")) ...

isinEnum功能(代码不好,仅供理解):

boolean isinEnum(enum enumeration, String search) {
  for(enum en : enumeration.values()){
    if(en.name().equalsIgnoreCase(search)) return true;
  }
  return false;
}

这种事情可能吗?

根据我在网上看到的内容,我认为不是,但也许有人有解决方案来做到这一点,而不是为每个枚举创建一个循环。

4

3 回答 3

1

这可能不是最干净的解决方案,因为它在正常程序流中使用异常,但它肯定很短,因为它避免了循环:

boolean isinEnum(Class<T> enumClass, String search) {
    try {
        Enum.valueOf(enumClass, search);
        return true;
    } catch (IllegalArgumentException iae) {
        return false;
    }
}
于 2012-05-28T03:00:08.213 回答
1

这是一种使用反射的方法...

public class EnumFinder {

    public static <T extends Enum<T>>  boolean isInEnum(Class<T> clazz, String name) {
        for (T e : clazz.getEnumConstants()) {
            if (e.name().equalsIgnoreCase(name)) {
                return true;
            }
        }

        return false;
    }

    public static void main(String[] argv) {
        System.out.println(isInEnum(MYENUM.class, "one"));   // true
        System.out.println(isInEnum(MYENUM1.class, "one"));  // false
    }
}

您在回答中的尝试实际上非常接近。唯一的区别是 Java 需要一个定义类的实例,以便在运行时动态地回答有关未知类型的问题。

于 2012-05-28T03:03:48.527 回答
0

你的问题有点难以理解,但我想我明白了它的要点。

你可能会让自己变得比必要的更艰难。

看看 Java 的映射接口/数据结构(在 java.util 中),看看这是否能让您更接近您的解决方案:

java.util 接口映射<K,V>

如果没有,请重新发布您所做的任何腿部工作,我会看看是否可以进一步帮助您。;-)

于 2012-05-28T02:59:34.157 回答