2

私がやりたいことが実行可能かどうかはわかりませんが、とにかく尋ねます。

この列挙型のコンストラクターで構築されている列挙型の値を知りたいです。擬似コードは次のとおりです。

enum SomeEnum {
    VALUE_ONE, VALUE_TWO;

    private SomeEnum() {
        System.out.print(*some-reflection-magic*);
    }
}

そのため、他の場所に電話をかけると、SomeEnum.VALUE_ONEに「VALUE_ONE」が表示されますSystem.out

理由は聞かないでください、ただの楽しみです:)

4

4 に答える 4

4

列挙型定数を使用するたびに何かを出力したい場合、答えはノーです。enum列挙値は、通常は型がロードされるときに一度インスタンス化されます(そして、多くの点で、JVMでの典型的なシングルトン実装を構成します) 。enumこれが、のコンストラクター内で印刷するときに、すべての値がインスタンス化されていることを確認する理由です。

于 2012-08-21T21:03:39.663 に答える
4

System.out.println(this);コンストラクターで、どのenum定数がインスタンス化されているかを出力します。

例:

public enum EnumExcersise {

    RED(5) {

        @Override
        public String getHexVal() {
            return "Red Value";
        }
    }, BLUE(4) {

        @Override
        public String getHexVal() {
            return "Blue Value";
        }
    }, GREEN(3) {

        @Override
        public String getHexVal() {
            return "Green Value";
        }
    }, YELLOW(8) {

        @Override
        public String getHexVal() {
            return "Yellow Value";
        }
    };

    public abstract String getHexVal();

    public int getVal() {
        return value;
    }
    private int value;

    private EnumExcersise(int ipValue) {
        System.out.println(this);
        this.value = ipValue;
    }
}

版画:

RED BLUE GREEN YELLOW
于 2012-08-21T20:54:49.683 に答える
2

列挙型メンバーは、static通常のクラスのメンバーのロジックに従います。これらはすべて、クラスの初期化時に初期化されます。これは、実行中のコードによってクラスが最初に参照されたときに発生します。

于 2012-08-21T21:15:01.947 に答える
0

すべての enum オブジェクト値は、JVM への最初のロード時に一度だけ自動的に作成されます。

enum SomeEnum {
    VALUE_ONE, VALUE_TWO;

    private SomeEnum() {
        System.out.println("Constructing SomeEnum " + name());
    }

    public static void main(String[] args) {
        System.out.println(VALUE_ONE);
    }
}

出力:

Constructing SomeEnum VALUE_ONE
Constructing SomeEnum VALUE_TWO
VALUE_ONE
于 2012-08-21T20:57:17.290 に答える