Java:如何制作最终的子阵列?

时间:2013-09-01 02:08:09

标签: java arrays multidimensional-array final

请考虑以下代码段:

public class TestBench {

    private static final short matrix[][] = new short[][] {new short[] {}};

    public static void main (String args[]) {
        matrix = new short[][] {new short[] {}}; // illegal
        matrix[0] = new short[] {}; // ok
    }
}

有没有办法让该子阵列最终?在阅读类似的问题时,我意识到我可以用自定义类来做到这一点,但我对使用原始类型感到好奇。

提前致谢。

4 个答案:

答案 0 :(得分:2)

private static final short[] subArrray = new short[] { };
private static final short matrix[][] = new short[][] { subArray };

答案 1 :(得分:1)

如果您正在尝试创建一个无法更改其单元格(或子阵列)的数组,那么您就不走运了。 Java数组的单元格总是可变的。

如果您需要该级别的不变性,最好的选择是为数组创建一个immutable包装类:

  • 对于1-D数组,我建议使用Collections.unmodifiableList或Guava不可变集合。 (不可变和不可修改之间的区别可能很大。)

  • 对于具有更高维度的数组,您可能需要构建自定义类来表示具有所需特征的数据结构。有现有的实现,但它们可能没有适合您的用例的模型。 (搜索“java immutable matrix”等等。)

如果您对数据结构(及其可变性特征)感到满意,并且您正尝试解决示例中的编译错误,请继续阅读。

当前尝试的问题实际上与基元或数组的工作方式无关。问题只是您在初始化后尝试分配给final。你不能那样做Java。

在这种特殊情况下有两种解决方案:

  • 如果初始化(例如数组的大小)不依赖于main提供的任何内容,只需将数组初始化移动到静态初始化类中;例如由Juvanias提议。

  • 如果初始化取决于main中的内容,那么您需要将数组变量放入final实例变量中,并在构造函数中进行初始化。

    < / LI>

答案 2 :(得分:1)

数组元素总是可变的。抱歉,没有办法让他们成为最终的。

顺便说一下,正是由于这个原因,EnumType.values()(其中EnumTypeenum类型)将始终在返回之前防御性地复制内部值数组,因为没有办法使内部值数组不可变。

答案 3 :(得分:1)

请注意,final修饰符会限制对变量的访问。它不是对变量类型的修改,而是对变量本身的修改。因此,它仅用于描述字段声明,而不是用于描述表达式或类型。

如果你希望数组中的值是不可变的(比如c ++中用const描述的类型),你需要使用自定义类。

一般来说,java没有很多与const相关的输入。他们甚至没有在const类型系统中加入任何内容。相反,他们依靠信息隐藏来实现相同的保护。即使用privateprotected隐藏字段,以便人们无法从课外分配这些字段。