Enum単純応用小結

4389 ワード

概要:
EnumはJAVA SE 5に新たに追加された機能であり、キーワードenumは、一般的なプログラムコンポーネントとして使用できる新しいタイプ(列挙クラス)として、名前付き値のセットの有限集合を作成することができる.
 
まず最も簡単なenumクラスを見てみましょう.
public enum Color{
    RED, GREEN, YELLOW
}
 
普通のクラスのように見えますが、「すべてのオブジェクト」の趣旨から見ると、enumは確かに「普通ではない」クラスです.実際、enumを作成すると、コンパイラはjavaから継承された関連クラスを作成します.lang.Enum.EnumクラスはCompareableとSerializableインタフェースを実現した.
 
Enumの簡単な特性:
1.列挙クラスとは
概要では、列挙クラスは、名前付きの値のセットの有限な集合であると説明しています.では、その中にある値は何ですか.クラスには独自の属性&メソッド(構築メソッドを含む)を除いてオブジェクトしか残っていない.前述のColor列挙クラスには属性&メソッドがないため、このRED、GREEN、YELLOWといった「名前付き値」は実際にはクラスのオブジェクトである.(これが列挙クラスの特殊な点であり、定義クラスの際にクラスオブジェクトが同時に定義されてカプセル化されている).
また、これらの列挙値(オブジェクト)は定数、すなわちpublic static finalタイプである.
考えてみるのも合理的だ.
列挙クラスは外部アクセスであり、publicは必ず必要である.
列挙クラスの用途は主に有限集合の分類状況を区別するためであり,主にどんな機能を実現するために用いられるのではなく,他のクラスに参照を提供するだけでよい.ましてクラス定義時にオブジェクトが生成されているのでstaticも必要です.
列挙クラスはクラス構築者が定義したものであり,クライアントプログラマが変更することは許されないためfinalも必要である.
画外音:命名規則に従って大文字で表す(複数の単語の間を下線で区切る)
 2.より豊満な列挙クラス
列挙クラスがクラスである以上、独自のメンバー変数、メソッド、コンストラクタを持つことができます.次の例を見てください.
 
public enum Color{

       RED("It's RED now ,stop crossing the road"),
       GREEN("It's GREEN ,you can go through"),
       YELLOW("It's YELLOW,you'd better wait for a while");

       private String description;
       
       private Color(String description){
            this.description = description;
       }

       public String getDescription(){
            return description;
       }


}

ここでは、いくつかの点に注意する必要があります.
a).コンストラクタを含む独自のメソッドを定義した場合は、enumインスタンスシーケンスの最後にセミコロンを追加する必要があります(単純なenumクラスにはセミコロンがありません)
b)カスタムメソッド(書き換えメソッドを含む)と属性はenumインスタンスの後に書かなければならない.そうしないとコンパイルエラーになる
c)ここではコンストラクタをprivateと宣言しますが、enumクラスの内部でそのコンストラクタを使用して列挙インスタンスを作成するしかありません.enumクラス定義が終了すると、コンパイラはコンストラクタを使用してオブジェクトを作成することを許可しません.したがってprivateとして宣言しなくてもアクセス性には何の違いもありません(http://www.iteye.com/problems/81762によれば、コンストラクタはpublicとして宣言できますが、eclipseはエラーを報告しています.理解できません)
d)enumクラスはfinalタイプであり,継承できない.
 
3.列挙クラスの一般的な方法
jd大神のブログですでに説明して、もうくどくどしません
 
4.switchのenum
ずっと列挙はswitchと相性がいいと思っていたので、とても便利でした.ここでjdのコードをコピーしてみます.
package enumTest;   
  
public class EnumTest {   
    enum Color {   
        RED(255, 0, 0), BLUE(0, 0, 255), BLACK(0, 0, 0), YELLOW(255, 255, 0), GREEN(   
                0, 255, 0);   
        //      ,  RED(255,0,0)   
        private Color(int rv, int gv, int bv) {   
            this.redValue = rv;   
            this.greenValue = gv;   
            this.blueValue = bv;   
        }   
  
        public String toString() { //     public     
            return super.toString() + "(" + redValue + "," + greenValue + ","  
                    + blueValue + ")";   
        }   
  
        private int redValue; //       ,private    。   
        private int greenValue;   
        private int blueValue;   
    }   
  
    public static void main(String args[]) {   
        // Color colors=new Color(100,200,300); //  ,             
        Color color = Color.RED;   
        System.out.println(color); //    toString()     
        System.out.println(Color.BLACK.ordinal());   
  
        // values        
        Color[] colors = Color.values();   
        for (Color c : colors)   
            System.out.println(c);   
  
        Color c = Color.RED;   
        switch (c) {   
        case RED:   
            System.out.println("it's red");   
            break;   
        case BLUE:   
            System.out.println("it's blue");   
            break;   
        case BLACK:   
            System.out.println("it's blue");   
            break;   
        }   
    }   
}  

コンパイラは、switchにdefault文があることも、列挙インスタンスごとに対応するcaseがあることも要求しないので、すべてのブランチを上書きすることに注意してください.ただし、case文でreturn文が呼び出されると(すべての列挙インスタンスを上書きするかどうかにかかわらず)、コンパイラはdefault文を要求します.