68

这个问题基本上是我之前问题的延伸。我问了上一个问题,以确保在类加载时填充 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");
  }

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

4

4 回答 4

96

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


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

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

  1. 暂时忘记命名约定,只需将常量命名为最有意义的名称:enum PropName { contents, columnHeadings, ...}. 这显然是最方便的。
  2. valueOf如果您真的喜欢命名约定,请在调用之前将您的 camelCase 输入转换为 UPPER_SNAKE_CASE 。
  3. 实现您自己的查找方法而不是内置方法valueOf来查找输入的相应常量。如果同一组常量有多个可能的映射,这是最有意义的。
于 2012-09-28T12:14:50.370 回答
12

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

getByName("COLUMN_HEADINGS")可能会工作。

于 2012-09-28T12:13:59.737 回答
2

而不是定义:COLUMN_HEADINGS("columnHeadings")

尝试将其定义为: COLUMNHEADINGS("columnHeadings")

然后,当您调用 时getByName(String name) method,使用大写字符串调用它,如下所示:getByName(myStringVariable.toUpperCase())

我和你有同样的问题,这对我有用。

于 2016-09-01T03:11:17.870 回答
1

当我试图传递我们从后端获得的Nullable Enum时,我遇到了解析枚举问题。当然,当我们获得价值时它正在工作,但是当 null 出现时它是问题。

java.lang.IllegalArgumentException:没有枚举常量

另外问题是当我们在 Parcelize 读取时刻写一些简短的 if

我的解决方案是

1.用解析方法创建伴生对象。

enum class CarsType {
    @Json(name = "SMALL")
    SMALL,
    @Json(name = "BIG")
    BIG;

    companion object {
        fun nullableValueOf(name: String?) = when (name) {
            null -> null
            else -> valueOf(name)
        }
    }
}

2.在Parcerable读取的地方这样使用

data class CarData(
    val carId: String? = null,
    val carType: CarsType?,
    val data: String?
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        CarsType.nullableValueOf(parcel.readString()),
        parcel.readString())
于 2019-10-11T09:12:05.993 回答