はじめに
Java学習中です
今回はenumについてまとめました
列挙型(Enum)とは
プログラムの中で定義する定数を拡張(列挙)し、さらに安全かつ便利にする仕組みのこと
書き方
// 通常のクラスの書き方
public class Dessert {
}
// enumの書き方
public enum Dessert {
APPLE, ICE_CREAM, CAKE, // 最後のカンマはなくてもok
}
呼び出す時
(staticの定数を呼ぶときと同じ)
System.out.println(Dessert.APPLE);
System.out.println(Dessert.CAKE);
#=> APPLE
CAKE
特徴
変数への代入ok
Dessert apple = Dessert.APPLE;
Dessert型のインスタンスが出来上がる
System.out.println(apple);
でさっきと同じ結果
メソッドの引数の型にできる
static void printDessertName01(Dessert dessert){
System.out.println(dessert);
}
呼び出す時はprintDessertName01(Dessert.APPLE);
String型でやってきたことを列挙型にしている
→これで意味の異なる別の引数を渡してしまわないように出来る
絶対列挙型の定数が引数に入るなら列挙型で指定しようってことでしょうか?
static void printDessertName02(String dessert){
System.out.println(dessert);
}
printDessertName02("cat");
とやると普通に通ってしまう
意図しない引数が渡ることを防止する意味で列挙型指定しておくと安心?
printDesertName01(Dessert.APPLE); // ok
printDessertName02("cat"); // 通ってしまう
printDesertName02(Dessert.APPLE); // コンパイルエラー
新しいインスタンスを生成できない
Dessert orange = new Dessert();
はできない(コンパイルエラー)
コンストラクタは自動生成されるがprivateなので外部から呼べないようになってる
==で比較できる
Dessert x = Dessert.APPLE;
Dessert y = Dessert.APPLE;
System.out.println(x == y); // trueを返す
列挙型ではstatic final
で宣言されてるので一つインスタンスが作られれば同じところを参照するの==
でもtrueが返ってくる
機能(メソッド)
name()
定数名そのものをString型で返す
System.out.println(Dessert.APPLE.name());
APPLE
と出力
ordinal()
列挙した順序をint型で返す
System.out.println(Dessert.APPLE.ordinal());
0
と出力
もっと活用
値を追加できる
列挙したインスタンスにさらに値をもたせることが出来る
public enum Dessert {
APPLE(100), ICE_CREAM(200), CAKE(300),
private int price;
private Dessert(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
System.out.println(Dessert.APPLE.getPrice());
100
と出力
メソッドを追加できる
インスタンス(定数)ごとにメソッドを追加することが出来る
抽象メソッド用意し、各インスタンスで継承するとインスタンスごとに実行したいコードを変えることが出来る
public enum Dessert {
// 基本形 public enum Dessert { APPLE, CAKE, }を変形
APPLE(100) {
@Override
void advertise() {
// りんご用のadvertiseの実装
System.out.println("まっかなりんごが" + getPrice() + "円!"); // getPriceメソッドも活用できる
}
},
CAKE(300) {
@Override
void advertise() {
// ケーキ用のadvertiseの実装
System.out.println("皆大好き甘いケーキが" + getPrice() + "円!");
}
},
;
// ここから色々宣言してる
private int price;
private Dessert(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
// 抽象メソッド、各インスタンスで実装する
abstract void advertise();
}
Dessert.APPLE.advertise();
で「まっかなりんごが100円!」と出力
Dessert.CAKE.advertise();
で「皆大好き甘いケーキが300円!」と出力
最後
正直使ってみないとピンときませんがとりあえずまとめてみました
閲覧頂きありがとうございました!