找出构造的枚举值

时间:2012-08-21 20:48:57

标签: java reflection enums

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

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

enum SomeEnum {
    VALUE_ONE, VALUE_TWO;

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

因此,当我在其他地方拨打SomeEnum.VALUE_ONE时,我会在System.out上获得“VALUE_ONE”。

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

如果你想要每次打印枚举常量,那么答案就是否定。枚举值被实例化一次(并且在很多方面构成JVM上的典型单例实现),通常是在加载enum类型时。这就是为什么在enum的构造函数中打印时,你会发现所有的值都被实例化了。

答案 2 :(得分:2)

Enum成员遵循常规课程static成员的逻辑。它们都是在类初始化时初始化的,这是在运行代码首次引用类时发生的。

答案 3 :(得分: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