2012-08-04 28 views
19

など列挙型は

enum Coffee { 
    BIG, 
    SMALL 
} 

と列挙型のこのようなインスタンス変数持つクラス:

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

はなぜに、コンストラクタでそれが可能です例えばcoffee.BIG? リファレンスを使用できるとわかりませんか?インスタンス変数としてenumはnull以外に初期化されていますか?第1章のSCJP本の自己テスト問題#4です。 私はコードと質問を短縮しようとしました。

答えて

18

大小は、コーヒークラスのpublic static finalフィールドであり、すべての静的フィールドのように、それらが

Coffee b1 = Coffee.BIG; 

又はクラスと同じタイプの参照によってように、クラス名によってアクセスすることができます、like

Coffee s2 = b1.SMALL; 
Coffee s3 = Coffee.BIG.SMALL; //BIG is reference of type Coffee so it is OK (but looks strange) 

ただし、参照番号で静的メンバーにアクセスしないようにしてください。これは、インスタンスのメンバーにはアクセスしていませんが、クラスのメンバーにはというメンバーにアクセスしていないため、混乱が生じます(たとえば、多態的な動作はありません)。

5

enumsを実装する方法は、プライベートコンストラクタと特定の値に初期化された同じクラスのpublic finalフィールドを持つクラスを作成することでした。

は、Java 5ので、列挙型構築物は、列挙型の値が

12

これは後ろを何が起こるかであるなどのパブリックstaticフィールドとなり、効果的に同じことを砂糖で、許可されていないNULL値のようなものの世話をしますシーン

E:\workspace>type Coffee.java 
public enum Coffee { 
    BIG, 
    SMALL 
} 

E:\workspace>javap Coffee 
Compiled from "Coffee.java" 
public final class Coffee extends java.lang.Enum<Coffee> { 
    public static final Coffee BIG; 
    public static final Coffee SMALL; 
    public static Coffee[] values(); 
    public static Coffee valueOf(java.lang.String); 
    static {}; 
} 

あなたはBIGSMALLがあなたの列挙型では、本質的に静的フィールドで見ることができるように。

JLSもこの部分を明確にする:列挙型のEは、列挙型から継承メンバーに加えて

を、それぞれの は、名前の列挙型定数を宣言したN、列挙型は暗黙的に を持っていますこれらのフィールドは、対応する列挙定数 と同じ順番で宣言されているとみなされ、静的フィールドは明示的に が列挙型で宣言される前に宣言されていると見なされます。このような各フィールドは、対応する定数enum に初期化されます。

これはあなたの質問を明確にします。

enum Coffee { 
    BIG, 
    SMALL 
}