作为Enum成员的数组无法编译

时间:2013-05-02 20:25:44

标签: java enums

这不起作用:

    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号对我不起作用。

4 个答案:

答案 0 :(得分:3)

表达式{"foobar","foobaz"}是一个数组初始值设定项,仅在直接声明数组时才有效。

尝试预先new String[]

FOO(new String[] {"foobar","foobaz"});

根据JLS, section 10.6

  

可以在声明中指定数组初始值设定项(§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"});

这样编译器就知道你要传递的数组的类型。