1

プロジェクトの作業中に、リポジトリでこのタイプのコードを見つけました。そのリポジトリは正常に機能します...しかし、独立したテスト実行を通じてコードを理解しようとすると...エラーが発生します!!!

public enum Fruits {
    static {
        APPLE= new Fruits( "APPLE", 0 );
        BANANA = new Fruits( "BANANA", 1 );
       // and so on.
    }
}

コンストラクターを宣言しないと、列挙型のコンストラクターを列挙型内で呼び出す意味を理解できません。

4

3 に答える 3

6

私の推測では、これは実際には実際のコードを逆コンパイルした結果です。これは有効な Java ソース コードではありませんが、事実上、コンパイラが次の列挙型を使用して作成するものです。

public enum Fruits {
    APPLE, BANANA;
}
于 2012-11-10T15:25:29.370 に答える
4

いつものように @JonSkeets の直感が勝ちます。彼が提供したコードをコンパイルします。

public enum Fruits {
  APPLE, BANANA;
}

次に、jad利回りで逆コンパイルします。

public final class Fruits extends Enum
{

    public static Fruits[] values()
    {
        return (Fruits[])$VALUES.clone();
    }

    public static Fruits valueOf(String s)
    {
        return (Fruits)Enum.valueOf(Fruits, s);
    }

    private Fruits(String s, int i)
    {
        super(s, i);
    }

    public static final Fruits APPLE;
    public static final Fruits BANANA;
    private static final Fruits $VALUES[];

    static
    {
        APPLE = new Fruits("APPLE", 0);
        BANANA = new Fruits("BANANA", 1);
        $VALUES = (new Fruits[] {
            APPLE, BANANA
        });
    }
}

完全な例は、列挙型を宣言するときにコンパイラが実行するすべての作業を示しています。@MarkoTopolnikが指摘しているように、コンパイラが許可しないという理由だけで、これを自分で行うことはできないことに注意してください。

于 2012-11-10T15:37:09.210 に答える
-1
    public enum Fruits {
        APPLE("APPLE", 0 ), BANANA("BANANA", 1 );
        String text;
        int value;
        private Fruits(String text, int value){
             this.text = text;
             this.value = value;
        }
        public String getText(){
             return text;
        }
        public int getValue(){
             return value;
        }
    }

この概念は、パラメーターを追加する場合に役立ちます。

于 2012-11-10T15:29:08.900 に答える