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はかなりの確率で見るので、まだまだ探っていかないとダメですね
間違っている箇所などがあれば教えてください!