5
public enum MyEnum1 {

    FOO(BAR), BAR(FOO);

    private MyEnum1 other;

    private MyEnum1(MyEnum1 other) {
        this.other = other;
    }

    public MyEnum1 getOther() {
        return other;
    }

}

MyEnum1Cannot reference a field before it is definedここでは宣言の順序が重要であるため、これは非常に理解できるエラーを生成します。しかし、なぜ次のコードはコンパイルされるのでしょうか?

public enum MyEnum2 {

    FOO { public MyEnum2 getOther() { return BAR; } },
    BAR { public MyEnum2 getOther() { return FOO; } };

    public abstract MyEnum2 getOther();

}

FOOBARが定義されている前に参照してBARいますが、間違っていますか?

4

3 に答える 3

1

最初のケースでは、まだ宣言されていない定数を参照して列挙型定数を作成しています。2 番目のケースでは、コンパイル順序のために問題ではなく、列挙定数は列挙体の前にコンパイルされます。これが理由だと言えます。そうでない場合は、各列挙型定数の本体で非抽象メソッド宣言の後に抽象メソッド宣言が定義されているため、コンパイルが早く失敗します。

良いリファレンス - http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9

于 2013-08-22T13:47:15.437 に答える