将数组常量传递给枚举构造函数

5

Java枚举允许您向构造函数传递参数,但似乎无法传递数组。例如,以下代码编译时没有错误:

enum Color {
    RED(255,0,0),
    GREEN(0,255,0),
    BLUE(0,0,255);

    int[] rgb;

    Color(int r, int g, int b) {
        rgb[0] = r;
        rgb[1] = g;
        rgb[2] = b;
    }
}

但如果这个数据作为一个数组常数传递进来,那么代码将无法编译:

enum Color {
    RED({255,0,0}),
    GREEN({0,255,0}),
    BLUE({0,0,255});

    int[] rgb;

    Color(int[] rgb) {
        this.rgb = rgb;
    }
}

我也尝试了创建新的int[]数组的不同方法,例如:

...
RED(new int[]{255,0,0}),
...

我没有运气。我认为问题在于传递一个数组常量。我不确定是需要修正简单的语法还是存在传递此类数据的潜在问题。提前感谢。


RED(new int[]{255,0,0}) 应该可以正常工作,尽管 @Mark Peters 的解决方案是理想的。 - Priyal
1个回答

7

您不能在此处使用字面形式,因为该语法仅允许在变量声明中使用。但是您可以使用varargs语法糖,这实际上更短。

enum Color {
    RED(255,0,0),
    GREEN(0,255,0),
    BLUE(0,0,255);

    int[] rgb;

    Color(int... rgb) {
        this.rgb = rgb;
    }
}

与你所说的相反,RED(new int[]{255, 0, 0}) 可以正常工作。


谢谢。我只尝试了新的int[]一行,所以它没有起作用。当我替换了所有三行时,它确实起作用了。关于varags的好点子。 - Cory N.
Varargs在参数列表末尾只能用于一个数组,如果有多个数组,则可以使用数组构造函数new T[]。因此,我们可以说语法允许将其作为字面参数传递给枚举元素吗? - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接