Java基礎ー定数クラスとEnum

定数クラスとEnum

1. 定数クラス

定数クラス:クラス内に定数のみが定義されているクラス。

基本的に定数は使用するクラスで定義するが、複数のクラスで同じ値を定数として定義する場合はそれらの定数をまとめて1つのクラスとすることがある。
全然関係ない定数を寄せ集めるのではなくて、関連している定数を集めて1つのクラスにする。
ex. メール送信機能の定数クラス、ログ出力機能の定数クラス

宣言方法

package jp.co.sample.study.constant;

import java.util.List;

/**
 * 定数クラスサンプル。<br>
 */
public class SampleConstants {

    public static final String SOME_CONSTANT = "定数";

    public static final int INT_CONSTANT = 3;

    public static final List<String> LIST_CONSTANT = List.of("りんご", "ばなな");
}

ポイント

  • アクセス修飾子はその定数に合ったものを指定する
    定数クラスは複数のクラスから使用することを想定しているので、基本的にはpublicとなる
  • 定数なのでfinal修飾子を付ける
  • インスタンスごとに値が変わったりするわけではないのでstaticを付ける

2. Enum

Enum:列挙型とも呼ばれていて、複数の定数をひとまとめにできる型の事
finalで宣言する定数とは異なり、1つの定数に対して複数の表現が定義できる。
定数で共通の処理を定義することができる。

宣言方法

public enum Fruit {
    APPLE,
    ORANGE,
    PEACH;
}

定義した値はEnum名.定数名で取得可能(以下は記述例)

public class Main {
    public static void main(String[] args) {
        Fruit flt = Fruit.ORANGE;
        System.out.println(flt.toString());   //ORANGE
    }
}

Enumに値を持たせる

値を持たせる場合は、その値を保持する変数と設定するためのコンストラクタ、取得するためのgetメソッドが必要。
Enumクラスを利用者側でnewされたくないので、コンストラクタはprivateで宣言する。

public enum Fruit {
    APPLE("りんご", 1),
    ORANGE("オレンジ", 2),
    PEACH("もも", 3);

    private String label;
    private int id;

    //コンストラクタはprivateで宣言
    private Fruit(String label, int id) {
        this.label = label;
        this.id = id;
    }

    public String getLabel() {
        return label;
    }

    public int getId() {
        return id;
    }
}

Enumに定義した値を取得する方法は以下の通り。

public class Main {
    public static void main(String[] args) {
        Fruit flt = Fruit.APPLE;
        System.out.println(flt.getLabel());       // りんご
        System.out.println(flt.getId());  // 1
        System.out.println(flt.toString());   // APPLE
    }
}

Enumに独自のメソッドを定義する

public enum Fruit {
    APPLE("りんご", 1),
    ORANGE("オレンジ", 2),
    PEACH("もも", 3);

    private String label;
    private int id;

    private Fruit(String label, int id) {
        this.label = label;
        this.id = id;
    }

    public String getLabel() {
        return label;
    }

    public int getId() {
        return id;
    }

    // 独自メソッド
    public static Fruit getById(int id) {
        for( Fruit flt : Fruit.values() ) {
            if( flt.getId() == id ) {
                return flt;
            }
        }
        return null;
    }
}

Enumにデフォルトで定義されているメソッド

宣言しているEnumの型をTとする

メソッド名 説明
static T valueOf(String) 引数の文字列に合致するenumを返すメソッド。
一致するenumが存在しない場合はIllegalArgumentExceptionを返す
static T[] values() enumの配列を返すメソッド。
String toString() enumとして宣言した文字列を取得するメソッド。
public class Main {
    public static void main(String[] args) {
         Fruit flt = Fruit.valueOf("PEACH");
         Fruit fluits = Fruit.values();

        Fruit flt = Fruit.APPLE;
        System.out.println(flt.toString());   // APPLE
    }
}