如何在Java中声明Enum中的字段?

时间:2012-04-05 12:04:21

标签: java enums

我想在Enum中声明静态(或非静态)变量。我需要这个,因为我想将枚举值与一些字符串相关联。但我不想硬编码这个字符串。我想使用我的应用程序范围的类与String常量。 即我想在enum声明中写这样的,但编译时错误:

public enum MyEnum {   
        private static final AppConstants CONSTANTS = AppConstants.getInstance();

        ONE(CONSTANTS.one()),
        TWO(CONSTANTS.two());
}

我怎样才能放入一个字段?

3 个答案:

答案 0 :(得分:5)

这是其中一个限制,必须指定枚举值第一个,但在每个实例化中你总是可以引用相同的singelton ...

enum MyEnum {

    ONE(Test.getInstance().one()),
    TWO(Test.getInstance().two());

    public final String val;

    MyEnum(String val) { this.val = val; }
}

输出“hello”的示例:

public class Test {
    public static void main(String[] args) {
        System.out.println(MyEnum.ONE.val);
    }

    public String one() {
        return "hello";
    }
    public String two() {
        return "world" ;
    }

    static Test instance;
    public synchronized static Test getInstance() {
        if (instance == null)
            instance = new Test();
        return instance;
    }
}

答案 1 :(得分:3)

有点hacky。但是你必须稍微更改你的AppConstants课程。

public enum MyEnum {   
    ONE(getConstant("one")),
    TWO(getConstant("one"));

    private static final AppConstants CONSTANTS = AppConstants.getInstance();

    private static String getConstant(String key) {
        // You can use a map inside the AppConstants or you can 
        // invoke the right method using reflection. Up to you.
        return CONSTANTS.get(key);
    }

    private MyEnum(String value) {

    }
}

答案 2 :(得分:2)

枚举常量需要是枚举

中的第一个元素
public enum MyEnum {   

    ONE,TWO;
    private static final AppConstants CONSTANTS = AppConstants.getInstance();

    @Override 
public String toString() {
       if(this==ONE){
           return CONSTANTS.one();
       } else if(this==TWO){
           return CONSTANTS.two();
       }
    return null;
}
}