テクニック

Enumの書き方、使い方を紹介!より変更に強いソースコードを目指して。

Enum,定義

今回は、Enumの書き方と使い方をご紹介します。

今回扱うメインの言語はJavaですが、考え方自体は他の言語でも通用するので、言語の違いはあまり気にしなくてもよいです。

Enumのメリットを簡単に説明すると、”定数を一元管理して共通化することで変更が楽になる”ということです。

詳しくはこちらでご紹介しています。

良いソースコードの書き方紹介!4つのポイントで自身のスキルと周りの評価がアップする方法!この記事では、ソースコードの記述テクニックをご紹介します。 プログラマとして、良いソースコードを記述するのに必須のテクニックです。...

Enumの書き方

Enumはあくまでも”型”なので、定義するときは型をenumにして定義します。今回は例として、国のEnumを定義します。

public enum Country {
    JAPAN,
    AMERICA,
    CHINA;
}

これでEnumが定義出来ました。

Enumには、フィールド変数や関数も定義できます。

まず、フィールド変数として国に”連番ID”と”日本語の名前”と”英語の名前”を定義します。

続いて、定義されている”連番ID”と”日本語の名前”と”英語の名前”を取得する関数を定義します。

public enum Country {
    // Enumの名前(連番ID, 日本語の名前, 英語の名前) と記述します。
    JAPAN(0, "日本", "Japane"),
    AMERICA(1, "アメリカ", "America"),
    CHINA(2, "中国", "China");
);

    // フィールド変数
    private final int id;               // 連番ID
    private final String japaneseName;  // 日本語の名前
    private final String englishName;   // 英語の名前

    // コンストラクタ
    private Country(final int id, final String japaneseName, final String englishName) {
        this.id = id;
        this.japaneseName = japaneseName;
        this.englishName = englishName;
    }

    // 連番ID取得関数
    public int getId() {
        return this.id;
    }
    
    // 日本語の名前取得関数
    public String getJapaneseName() {
        return this.japaneseName;
    }

    // 英語の名前取得関数
    public String getEnglishName() {
        return this.englishName;
    }
}

一般的には、ここまで定義できれば大丈夫です。後は、使いやすいように必要な関数や定義を増やして使用します。

Enumの使い方

実際に定義したEnumの使い方をご紹介します。

ソースコードの中では、国は全て大文字の”JAPAN”や”AMERICA”として扱い、必要に応じて”JAPAN”に定義されている”連番ID”や”日本語の名前”、”英語の名前”を取得して使用します。

定義した値の取得

定義した値を使用するには、任意の定義から値取得用の関数を使用して取得します。

// 日本の連番IDを取得する場合
int id = Country.JAPAN.getId();

Enumを条件分岐として使う

定義したEnumは条件の比較として使われることも多いです。

例えば、国が日本なら日本語の名前を取得、それ以外なら英語の名前を取得する関数は以下のようになります。

// 国の名前を取得する関数(引数はCountry型を渡す)
public String getNameOfCountry(Country country) {
    if (country == Country.JAPAN) {
        // 国が日本なら日本語の名前を返す
        return country.getJapaneseName();
    } else {
        // 国が日本以外なら英語の名前を返す
        return country.getEnglishName();
    }
}

さらに、Switch文でもEnumを使うこともできます。

// 国の名前を取得する関数(引数はCountry型を渡す)
public String getNameOfCountry(Country country) {
    switch (country) {
        case JAPAN:
            return country.getJapaneseName();
            break;
        case AMERICA:
            return country.getEnglishName();
            break;
        case CHINA:
            return country.getEnglishName();
    }
}

定義された値からEnumを逆引き

Enum定数からEnumを逆引きするには、valueOf関数を使用します。

例では、JAPANという文字列から一致する、EnumのJAPANを取得しています。

Country country = Country.valueOf("JAPAN");

また、Enumに次のような関数を定義することで、Enumで定義された値からEnumを逆引きすることも可能です。

この例では、連番IDを引数に取り、定義された連番IDのEnumを取得しています。

// 連番IDからEnumを取得する関数(引数は連番ID)
public static Country valueOf(Integer id) {
    for (Country country : values()) {
        if (country.getId.equals(id)) {
            return country;
        }
    }
}

Enumを使うタイミング

重要なのはここからです。

上記で、EnumからEnum定数を取得する方法と、定数からEnumを取得する方法をご紹介しました。

つまり、Enumさえ定義しておけば、いつでもEnumに変換することが出来るということです。

ソースコード上では、定数をそのまま扱うことは良いコードとは言えません。

そのため、ソースコード上では、定数は常にEnumとして扱いましょう。

変数定義は常にEnum型の変数を定義し、定数が必要な箇所でEnumから値を取得して使用します。

逆に、ユーザからの入力値やデータベースに格納されている値がEnumで定義された定数の場合は、一旦Enumを逆引きしてEnumに戻して扱いましょう。

このように、Enum以外では定数を一切記述しないようにすることで、全ての定数がEnum管理でき、変更に強いソースコードになります。

まとめ

今回は、Enumの書き方と使い方、使うタイミングについてご紹介しました。

Enumは条件分岐などで使われることが多く、また、Enumから定数を呼び出すだけでなく、Enumで定義した定数からEnumを逆引きすることも可能です。

ソースコード中に定数を直接書かずに、全てEnumで管理することで、定数の値を修正するような場合でもEnumで定義された一箇所だけの修正で済みます。

これを徹底することで、修正が簡単になるため変更に強いソースコードに一歩近づきます。

変更に強いソースコードの重要性については、こちらの記事でご紹介しています。他にも、重要なテクニックを紹介しているので、合わせて読むことをオススメします。

強い
変更に強いソースコードが重要視される時代この記事では、変更に強いソースコードの重要性をご紹介します。 システム構築の際に、既存のソースコードに修正を加えたとき、思ってもい...

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です