0
0

More than 1 year has passed since last update.

Javaのenum型(列挙型)

Posted at

enum型とは

・定数を一つの型でまとめて管理できるクラス(一応)
・通常のクラスとは異なり、new演算子でオブジェクトは生成できない
・同じような意味を持つ定数をまとめて管理できる

定義方法

public enum Animal {
    CAT,
    DOG,
    FOX,
}

使ってみる

今の現場ではenum型の定数を使った時、フィールドに値がセットされる使い方が多い。

public enum Animal {
    CAT("猫",1),
    DOG("犬",2),
    FOX("狐",3);

    private String name;
    private int id;

    private Animal(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }
}
class Pet {
    public static void main(String[] args) {
        Animal animal = Animal.CAT;

        if(animal.getName().equals("猫")) {
            System.out.println("にゃー"); //ここが実行される
        }
        else if(animal.getName().equals("犬")) {
             System.out.println("わん");
        }
        else {
             System.out.println("コン");
        }
    }
}

個別の実装

enum定数ごとに個別の実装も持てる

enum Animal {
    CAT("猫") {
        @Override
        void exec() {
            System.out.println("にゃー");
        }
    },
    DOG("犬") {
        @Override
        void exec() {
            System.out.println("わん");
        }
    },
    FOX("きつね") {
        @Override
        void exec() {
            System.out.println("こん");
        }
    }
    //個別実装したいメソッドを抽象化させる
    abstract void exec();
}

enumのメリット

enumで定数を管理することによって予期せぬ値が渡されるのを防ぐ。
以下のcryメソッドは猫、犬、きつねのどれかが来た時を想定して作られたメソッド。
executeメソッドでは「うさぎ」を引数にcryメソッドを使用しているので本来の使い方としては誤っている。
しかし文法的には間違っていないのでコンパイルエラーにはならずに実行されてしまう。

class Animal {
    final String CAT = "猫";
    final String DOG = "犬";
    final String FOX = "きつね";

    public void cry(String name) {
        if(name.equals(CAT)) {
            System.out.println("にゃー");
        }
        else if(name.equals(DOG)) {
            System.out.println("わん");
        }
        else {
            System.out.println("こん");
        }
    }

    public void execute() {
        String RABBIT = "うさぎ";
        cry(RABBIT);
     }
}

enumを使用すれば「うさぎ」を引数にしようとした時点でコンパイルエラーを起こしてくれる

public enum Animal {
    CAT("猫",1),
    DOG("犬",2),
    FOX("狐",3);

    private String name;

    private Animal(String name, int id) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
class Pet {
    public static void main(String[] args) {
        //RABBITは定義されていないのでコンパイルエラー
        String animal = Animal.RABBIT;
        cry(RABBIT);
    }

    public void cry(String name) {
        if(name.equals(CAT)) {
            System.out.println("にゃー");
        }
        else if(name.equals(DOG)) {
            System.out.println("わん");
        }
        else {
            System.out.println("こん");
        }
    }
}

終わり

enumの使い方はまだまだありそうです!
実務ではenumはかなりの確率で見るので、まだまだ探っていかないとダメですね:relieved:
間違っている箇所などがあれば教えてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0