LoginSignup
0
0

More than 1 year has passed since last update.

[Java] 列挙型・enum

Last updated at Posted at 2022-07-02

はじめに

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円!」と出力

最後

正直使ってみないとピンときませんがとりあえずまとめてみました
閲覧頂きありがとうございました!

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