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」の場合、(少なくとも) 3 つの選択肢があります。

  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 に答える