如何检查给定字符串是否是Java中任何给定枚举的一部分?

时间:2012-04-17 21:29:28

标签: java enums

我有两个不同的枚举,我希望能够输出是否给定 string是枚举集合的一部分。这是我的代码:

public class Check {
    public enum Filter{SIZE, DATE, NAME};
    public enum Action{COPY, DELETE, REMOVE};

    public boolean isInEnum(String value, Enum e){
        // check if string value is a part of a given enum
        return false;
    }

    public void main(){
        String filter = "SIZE";
        String action = "DELETE";
                // check the strings
        isInEnum(filter, Filter);
        isInEnum(action, Action);
    }
}
eclipse说在最后两行“过滤器无法解析为变量”但是 除此之外,函数“isInnnum”中的Enum param似乎是错误的。

这里有什么问题可以帮助吗?

6 个答案:

答案 0 :(得分:20)

最简单(通常最有效)的方法如下:

public <E extends Enum<E>> boolean isInEnum(String value, Class<E> enumClass) {
  for (E e : enumClass.getEnumConstants()) {
    if(e.name().equals(value)) { return true; }
  }
  return false;
}

然后拨打isInEnum(filter, Filter.class)

答案 1 :(得分:9)

如果您不介意使用Apache commons lang3库,可以使用以下代码:

EnumUtils.isValidEnum(Filter.class, filter)

根据docs

  

此方法与Enum.valueOf(java.lang.Class,java.lang.String)的不同之处在于它不会为无效的枚举名称抛出异常。

答案 2 :(得分:5)

以下是Louis Wasserman的Java 8 /流版本的答案。 (您也可以将此方法直接放入Enum类中,并删除其中一个参数)

public boolean isInEnum(String value, Class<E> enumClass) {
    return Arrays.stream(enumClass.getEnumConstants()).anyMatch(e -> e.name().equals(value));
  }

答案 3 :(得分:2)

我没有足够的观点来直接评论西蒙塔的答案,但是这里提到的第二种方法是直接在枚举类中进行的:

var query = new esri.tasks.Query();
        var queryTask = new esri.tasks.QueryTask("https://services.arcgisonline.nl/arcgis/rest/services/Basisregistraties/BAG/MapServer/4");

        thema_4_Verblijf = new FeatureLayer("https://services.arcgisonline.nl/arcgis/rest/services/Basisregistraties/BAG/MapServer/4");
        map_Thema_4.addLayer(thema_4_Verblijf);
        thema_4_Verblijf.on("click", thema_4_Verblijf_Click);

        function thema_4_Verblijf_Click(evt){
            query.returnGeometry = true;
            query.outFields = ["*"];
            query.geometry = evt.mapPoint;
            executeQuery();
        };

        function executeQuery()
        {
            queryTask.execute(query,Selectie);
        }

        function Selectie(featureSet){
            alert("function called");
        }

答案 4 :(得分:0)

避免使用循环进行验证。

我建议使用valueOf。此方法内置于枚举,可能会考虑进行编译时优化。

这类似于实现静态Map<String,EnumType>来优化查找,这是您可以采取的另一个考虑因素。

缺点是您必须使用异常处理机制来捕获非枚举值。

实施例

public enum DataType {
  //...
  static public boolean has(String value) {
    if (value== null) return false;
    try { 
        // In this implementation - I want to ignore the case
        // if you want otherwise ... remove .toUpperCase()
        return valueOf(value.toUpperCase()); 
    } catch (IllegalArgumentException x) { 
        // the uggly part ...
        return false;
    }
  }
}

另请注意,使用上面的类型实现,您的代码在调用时看起来更干净。你的主要现在看起来像:

public void main(){
    String filter = "SIZE";
    String action = "DELETE";

    // ...

    if (Filter.has(filter) && Action.has(action)) {
      // Appropriate action
    }
}

然后另一个提到的选项是使用静态Map。您可以使用这种方法来基于其他属性缓存所有类型的索引。在下面的示例中,我允许每个枚举值具有别名的列表。在这种情况下,查找索引将不区分大小写,强制为大写。

public enum Command {
  DELETE("del","rm","remove"),
  COPY("cp"),
  DIR("ls");

  private static final Map<String,Command> ALIAS_MAP = new HashMap<String,Command>();
  static {
    for (Command type:Command.values()) {
      ALIAS_MAP.put(type.getKey().toUpper(),type);
      for (String alias:type.aliases) ALIAS_MAP.put(alias.toUpper(),type);
    }
  }

  static public boolean has(String value) {
    return ALIAS_MAP.containsKey(value.toUpper());
  }

  static public Command fromString(String value) {
    if (value == null) throw new NullPointerException("alias null");
    Command command = ALIAS_MAP.get(value);
    if (command == null) throw new IllegalArgumentException("Not an alias: "+value);
    return command;
  }

  private List<String> aliases;
  private Command(String... aliases) {
    this.aliases = Arrays.asList(aliases);
  }
}

答案 5 :(得分:0)

也可以这样做:

public boolean isInEnum(String value, Enum e){
    return Enums.getIfPresent(e.class, value).isPresent();
}

可以在here找到更多详细信息。