UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Java】StringからEnumへの変換

言語のEnumクラスを以下のように定義していたとき、文字列の"EN""JA"からEnumに変換したくなった

public enum Language {
  EN("en"),
  JA("ja");
  private final String code;

  Language(String code) {
    this.code = code;
  }

  public String getCode() {
    return code;
  }
}

この場合にどうやるかがぱっと出てこなかったので調査

valueOfメソッドを使う

Language.valueOf(lang);

jshellで確認

jshell> public enum Language {
   ...>   EN("en"),
   ...>   JA("ja");
   ...>   private final String code;
   ...>   Language(String code) {
   ...>     this.code = code;
   ...>   }
   ...>   public String getCode() {
   ...>     return code;
   ...>   }
   ...> }
|  次を作成しました: 列挙型 Language

jshell> Language lang = Language.valueOf("EN");
lang ==> EN

jshell> String langCode = lang.getCode();
langCode ==> "en"

定義していない列挙子の文字列を入れたら

定義していない列挙子の文字列を入れた場合、IllegalArgumentException例外が発生する

jshell> Language lang = Language.valueOf("KO");
|  java.lang.IllegalArgumentException thrown: No enum constant REPL.$JShell$11.Language.KO
|        at Enum.valueOf (Enum.java:240)
|        at Language.valueOf (#1:1)
|        at (#4:1)

codeからEnumを取得する方法

コード値の"en""ja"からEnumを取得する方法は定義した列挙子の数だけループさせ、getCode しながら付き合わせるしかないっぽい

  public static Language getByCode(String code) {
    return Arrays.stream(Language.values())
            .filter(data -> data.getCode().equals(code))
            .findFirst()
            .orElse(null);
  }