这不起作用:
public enum TestEnum {
FOO({"foobar","foobaz"}); //This fails
private final String[] indicators;
TestEnum(String[] indicators){
this.indicators = indicators;
}
private String[] getIndicators(){
return this.indicators;
}
上面的代码无法编译。下面的一个成功编译
public enum TestEnum {
FOO(new String[3]); //This is okay. Why?
private final String[] indicators;
TestEnum(String[] indicators){
this.indicators = indicators;
}
private String[] getIndicators(){
return this.indicators;
}
我的目标是提供一个可由多个字符串表示的枚举。我知道EnumMap
,但它在这里不起作用,因为我感兴趣的映射来自<String,enum>
。我也知道我可以使用普通Map
。我想我很好奇为什么1号对我不起作用。
答案 0 :(得分:3)
表达式{"foobar","foobaz"}
是一个数组初始值设定项,仅在直接声明数组时才有效。
尝试预先new String[]
:
FOO(new String[] {"foobar","foobaz"});
可以在声明中指定数组初始值设定项(§8.3,§9.3, §14.4),或作为数组创建表达式(第15.10节)的一部分来创建 一个数组并提供一些初始值。
也就是说,您需要一个array creation expression, section 15.10。
答案 1 :(得分:2)
你可以这样做:
public enum TestEnum {
FOO(new String[] { "foobar", "foobaz" });
private final String[] indicators;
TestEnum(String[] indicators) {
this.indicators = indicators;
}
private String[] getIndicators() {
return this.indicators;
}
}
答案 2 :(得分:2)
{"foobar","foobaz"}
仅在初始化最近声明的数组时起作用,例如:
String[] foos = {"foobar","foobaz"};
如果声明数组并尝试提供此值,则不会编译:
String[] foos;
foos = {"foobar","foobaz"};
如果要进行编译,则必须在new String[]
之前添加{}
:
String[] foos;
foos = new String[]{"foobar","foobaz"};
答案 3 :(得分:1)
而不是
FOO({"foobar","foobaz"});
试
FOO(new String[]{"foobar","foobaz"});
这样编译器就知道你要传递的数组的类型。