Javaの新しい特性のEnumの詳細(二)

4555 ワード

1.列挙要素リストは列挙クラスの一番前に書かなければならない.各要素間はカンマで区切られている.要素リストの終了位置後に他の内容がなければ、セミコロンを書かなくてもいい.そうしないと書かなければならない.2.列挙クラスのすべてのコンストラクタはprivateであり、外部プログラムは列挙クラスのインスタンスを作成できません.列挙クラスでは、どのコンストラクタを呼び出すかを明示的に示すことができる、例えば、MEMBERとMEMBER()の2つの要素リスト宣言は等価であり、いずれもデフォルトのコンストラクタを呼び出すものであり、MEMBER(「一般会員」)は明示的にプログラムが2番目のコンストラクタを呼び出すものである.(1)コンストラクタは列挙値を構築する際にのみ呼び出される.(2)コンストラクタはプライベートprivateのみであり,publicコンストラクタは絶対に許されない.これにより、外部コードが列挙クラスのインスタンスを新しく構築できないことを保証できます.列挙値がpublic static finalの定数であることを知っているからだ.また、このプライベート修飾子はコンパイラによって自動的に追加されます.これらの構造関数を定義するときにpublic修飾子を前に付けると、コンパイルエラーが発生しますが、クラスを列挙する方法とデータドメインでは外部アクセスが許可されます.(3)列挙タイプで定義各値は列挙タイプの一例であり、デフォルトではEnum(String name,int ordinal)コンストラクタにマッピングされる.列挙タイプは、パラメータを使用して、独自の構造関数を定義することができます.       3.列挙クラスには抽象的なメソッドがありますが、要素リスト宣言でこれらのメソッドを実装する必要があります.さらに、列挙クラスでは、上記の例に示すように、一般的なメンバー変数とメソッドを宣言することもできます.列挙クラスでよく見られる方法1).toString()メソッドは、列挙クラス要素を表示し、前例ではこのメソッドを上書きし、上書きしない場合は一般的に変数名を印刷し、前例では「MEMBER」、「ADMIN」、「SUPERADMIN」である.    2).valueOf(String arg 0)メソッドでは、入力arg 0文字列から列挙クラスのインスタンスが解析され、入力文字列は要素リストの名前の1つでなければjavaが投げ出される.lang.IllegalArgumentException異常は,webアプリケーションにおいてこの手法の役割が重要である.この方法は、EnumAccessControllなどのインスタンスを作成することなく使用できる静的方法である.valueOf(「MEMBER」)は、メンバーインスタンスを返すことができる.    3).values()メソッドは、配列の要素が列挙クラスの要素リストの要素である列挙クラスの配列を返します.    4).ordinal()メソッドは、列挙要素インスタンス内の要素リストの位置を返し、開始位置は0です.例えばEnumAccessControll.SUPERADMIN.ordinal()の結果は2です.    5).compareTo()メソッドで、2つの要素を比較します.    6).getDeclaringClass()は、この列挙定数の列挙タイプに対応するClassオブジェクトを返します.    7).name()メソッドは、デフォルトではfinalで上書きできない要素の実列の変数名を返す.
注意:1:作成されたすべての列挙タイプはjavaに拡張されます.lang.Enum. EnumはJ 2 SE 5.0で定義された新しいクラスであり、それ自体は列挙タイプではない.列挙タイプを作成する場合、enumキーを使用する必要があり、作成した列挙タイプはすべて実際にはEnumのサブクラスであるにもかかわらず、Enumを継承するクラスを直接定義して列挙タイプを作成することはできない.2:列挙タイプで定義各値は列挙タイプの一例であり、デフォルトではEnum(String name,int ordinal)コンストラクタにマッピングされる.列挙タイプは、パラメータを使用して、独自の構造関数を定義することができます.また強調する2点:1)1つは、これらの列挙型の構造関数がすべて私有であることである.他のクラスや他の列挙タイプに呼び出すことはできません.また、このプライベート修飾子はコンパイラによって自動的に追加され、これらの構造関数を定義する際に、前にpublic修飾子を付けると、コンパイルエラーが発生します.2)変数定義は、列挙タイプ値定義の3:列挙タイプの各値がpublic,static and finalである必要があります.すなわち、これらの値は一意である、一旦定義すると書き換えや修正ができない.また、列挙タイプの各値宣言時にstaticキーワードが表示されないにもかかわらず、実際には値は静的であり、値の前にstatic,public,final修飾子4:switch文で列挙タイプを使用する場合、列挙タイプ値の前に列挙タイプのクラス名(caseの後ろの値)を付けることはできません.そうでないとコンパイラは5:J 2 SE 5.0のjavaを間違えます.utilパッケージには2つの新しいクラス:EnumMapとEnumSetが提供され、この2つのクラスと列挙タイプの結合アプリケーションは以前非常に煩雑なプログラムを簡単に便利にすることができる.EnumMapクラスはjavaを提供する.util.Mapインタフェースの特殊な実装で、このインタフェースのキー(key)は列挙タイプ6:定数に固有のクラス本体である:列挙タイプといえば自分の関数を定義することができるが、実際にはさらに、列挙タイプの各値は列挙クラスで定義された抽象関数列挙に新しい方法を追加することができる.
public enum OzWitch {
    WEST("west"),
    NORTH("north"),
    EAST("east"),
    SOUTH("south");
    private String description;
    private OzWitch(String description){
        this.description=description;
    }
    public String getDescription(){
        return description;
    }
    public static void main(String[] args){
        for(OzWitch witch:OzWitch.values())
            System.out.println(witch+":"+witch.getDescription());
    }
}

enumを上書きする方法はtoString()メソッドを上書きし、異なる文字列記述情報を生成する別の方法を提供します.次の例では、インスタンスの名前を使用しますが、enumのtoStringを上書きする方法と一般クラスを上書きする方法には違いがありません.
public enum SpaceShip {
    SCOUT,CARGO,TRANSPORT,CRUISER,BATTLESHIP,MOTHERSHIP;
    public String toString(){
        String id= name();
        String lower=id.substring(1).toLowerCase();
        return id.charAt(0)+lower;
    }
    public static void main(String[] args){

    }
}
run:
Scout
Cargo
Transport
Cruiser
Battleship
Mothership

values()VS getEnumConstants()valuesメソッドはコンパイラによってenum定義に挿入されるstaticメソッドのため、enumインスタンスをEntumにアップコンバートするとvalues()メソッドはアクセスできませんが、ClassにはgetEnmuConstants()メソッドがあるので、Enumインタフェースにvalues()メソッドがなくても、Classオブジェクトからすべてのenumインスタンスを取得できます.
enum Search { HITHER,YOU}
public class UpcastEnum {
    public static void main(String[] args){
        Search[] vals= Search.values();
        Enum e= Search.HITHER;
        for(Enum en: e.getClass().getEnumConstants())
            System.out.println(en);
    }

}
run:
HITHER
YOU

PS:getEnmuConstants()はClass上のメソッドであるため、ブッシュ氏が列挙したクラスに対してこのメソッドを呼び出すこともできますが、値はnullを返します.その結果を使用しようとすると異常が発生します.Enumの実装は継承ではなく、Javaからすべてのenumが継承されていることを知っています.lang.Enumクラス、javaは多重継承をサポートしていないため、あなたのenumは他のクラスを継承することはできません.