[java]enum


Enumの背景を導入


たとえば、
public final static int APPLE = 1;
public final static int PEACH = 2;

public final static int GOOGLE = 1;
public final static int APPLE = 2;
APPLEが重なる.

どうやって解決しますか?


題名
FRUITE_APPLE
COMPANY_APPLE

もっと簡潔にしたいなら?

interface FRUIT {
   int APPLE = 1, PEACH = 2, BANANA = 3;
}
interface COMPANY {
   int GOOGLE = 1, APPLE = 2, ORACLE = 3;
}
もっと簡潔になった
どうしたんですか.

  • 前述は共通静的finalであることを示している.

  • さっき接頭辞をつけて名前ごとの衝突性を下げたいと思っていましたが、今はインタフェースで果物なのか企業の定数なのかを隔離しているので、名前が衝突する確率はありません.
  • それも問題ですか。


    例えば、FRUIT.APPLE == COMPANY.APPLE.
    定数が等しい場合、実際にはtrueです.そもそも比較すらできない.
    また,コンパイル時にも問題がないので,後で問題を見つけるのは難しい.

    この問題を解決しますか?


    まず問題の原因を見てみましょう
    intという同じデータ型を使用していますので、比較できます
    左、右の項目が異なるデータ型を使用している場合は、比較できません.
    では、違うデータ型を試してみましょう.
    class Fruit {
    	public static final Fruit APPLE = new Fruit();
    	public static final Fruit PEACH = new Fruit();
    	public static final Fruit BANANA = new Fruit();
    }
    
    class Company {
    	public static final Fruit GOOGLE = new Fruit();
    	public static final Fruit APPLE = new Fruit();
    	public static final Fruit ORACLE = new Fruit();
    }
    データ型によってはまったく比べものにならない

    でも問題は?


    主に書き込み定数はswitch文とともに使用されますが、switch文に入力できるデータ型はprimitiveデータ型のみであり、参照型と現在学習するenumに変換できます.

    Enumはどのように使いますか?

    enum Fruit {
    	APPLE, PEACH, BANANA;
    }
    上のclass Fruitに比べて使いやすくなっています.

    なぜenumを使わなければならないのですか?

  • コードは簡単になります.
  • enumは実際にはクラスですが、インスタンスを作成および継承できないため禁止されています.
  • キーワードenumを用いたので,実現の意図を明確に示すことができる.
  • Enumとジェネレータ



    写真はFruitにcolorという状態を示しています.
    まず、フィールドに変数を宣言し、写真に示すように構造関数として使用します.
    enumもクラスなので、メソッドも利用できます.
    カラーがポップアップされると、データを保護するために
    リターンStringのgetColor()メソッドを作成して取り出すのも良いアイデアです.

    各enumを呼び出す

    for(Fruit f : Fruit.values()){
    	print(f);
    }