2

我不知道我想做的事情是否可行,但无论如何我都会问。

我想找出在这个枚举的构造函数中构造了哪个枚举值。这是伪代码:

enum SomeEnum {
    VALUE_ONE, VALUE_TWO;

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

所以当我打电话给SomeEnum.VALUE_ONE其他地方时,我的System.out.

不要问为什么,只是为了好玩:)

4

4 回答 4

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 回答
4

如果您希望每次使用枚举常量时都打印一些内容,那么答案是否定的。枚举值被实例化一次(并且在许多方面构成了 JVM 上典型的单例实现),通常是在enum加载类型时。这就是为什么在enum's 构造函数中打印时,您会观察到所有值都被实例化了。

于 2012-08-21T21:03:39.663 回答
2

枚举成员遵循static常规类成员的逻辑。它们都是在类初始化时初始化的,这发生在运行代码第一次引用类的那一刻。

于 2012-08-21T21:15:01.947 回答
0

所有枚举对象值仅在初始加载到 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 回答