java.lang.IllegalArgumentException的原因是什么:没有枚举 const 类,即使迭代 values() 工作正常?

2022-08-31 13:19:56

这个问题基本上是我上一个问题的延伸。我问了前面的问题,以确保在类加载时填充Enum常量。这是我的类,再次添加了一个简单的方法:getByName

public enum PropName {

  CONTENTS("contents"),
  USE_QUOTES("useQuotes"),
  ONKEYDOWN("onkeydown"),
  BROWSER_ENTIRE_TABLE("browseEntireTable"),
  COLUMN_HEADINGS("columnHeadings"),
  PAGE_SIZE("pageSize"),
  POPUP_TITLE("popupTitle"),
  FILTER_COL("filterCol"),
  SQL_SELECT("sqlSelect"),
  ;

  private String name;

  private PropName(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public static PropName getByName(String name){
    return   PropName.valueOf(name);
  }
}

对该方法的调用正在抛出,但是如果我用以下代码替换此方法,则它只会起作用。getByName("columnHeadings")java.lang.IllegalArgumentException: No enum const class labware.web.component.limsgrid.PropName.columnHeadings

 public static PropName getByName(String name){
    for(PropName prop : values()){
      if(prop.getName().equals(name)){
        return prop;
      }
    }

    throw new IllegalArgumentException(name + " is not a valid PropName");
  }

关于我在这里做错了什么的任何想法?


答案 1

Enum.valueOf()仅检查常量名称,因此您需要传递它而不是“列标题”。您的属性与枚举内部无关。"COLUMN_HEADINGS"name


要解决评论中的问题/疑虑:

枚举的“内置”(隐式声明)方法将查找具有该确切名称的枚举常量。如果你的输入是“columnHeadings”,你(至少)有三个选择:valueOf(String name)

  1. 稍微忘记命名约定,只需命名常量,因为它最有意义:.这显然是最方便的。enum PropName { contents, columnHeadings, ...}
  2. 在调用 之前,将 camelCase 输入转换为 UPPER_SNAKE_CASE 如果您真的喜欢命名约定。valueOf
  3. 实现您自己的查找方法而不是内置方法,以查找输入的相应常量。如果同一组常量有多个可能的映射,则最有意义。valueOf

答案 2

这是因为您为枚举定义了自己的 版本,并且没有使用它。namegetByName

getByName("COLUMN_HEADINGS")可能会起作用。