1. ホーム
  2. java

[解決済み】java.lang.IllegalArgumentExceptionの理由は何ですか?values()を繰り返し実行するのは問題ないのに、enum constクラスがない?

2022-01-27 01:17:18

質問

この質問は、基本的に私の 前回の質問 . 私は前の質問で、クラスがロードされるときに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");
  }

何が間違っているのか、何か思い当たることはありますか?

解決方法は?

Enum.valueOf() は定数名しかチェックしないので、定数名を渡す必要があります。 "COLUMN_HEADINGS" の代わりに、"columnHeadings" を使用します。あなたの name プロパティはEnumの内部とは関係ありません。


コメントにある疑問・不安の解消に。

enumの"builtin"(暗黙のうちに宣言されている)。 valueOf(String name) メソッドは、その正確な名前の enum 定数を検索します。入力が "columnHeadings" であれば、(少なくとも)3つの選択肢があることになります。

  1. 命名規則を少し忘れて、最も理にかなっているように定数を命名してください。 enum PropName { contents, columnHeadings, ...} . これが一番便利なのは明らかです。
  2. を呼び出す前に、キャメルケースの入力を UPPER_SNAKE_CASE に変換してください。 valueOf もし、あなたが本当に命名規則が好きなら。
  3. 組み込みのルックアップ・メソッドではなく、独自のルックアップ・メソッドを実装します。 valueOf を使用して、入力に対応する定数を探します。これは、同じ定数セットに対して複数のマッピングの可能性がある場合に、最も理にかなっています。