我想在Enum中声明静态(或非静态)变量。我需要这个,因为我想将枚举值与一些字符串相关联。但我不想硬编码这个字符串。我想使用我的应用程序范围的类与String常量。
即我想在enum
声明中写这样的,但编译时错误:
public enum MyEnum {
private static final AppConstants CONSTANTS = AppConstants.getInstance();
ONE(CONSTANTS.one()),
TWO(CONSTANTS.two());
}
我怎样才能放入一个字段?
答案 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;
}
}