0

考虑以下代码段:

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

4 回答 4

2
private static final short[] subArrray = new short[] { };
private static final short matrix[][] = new short[][] { subArray };
于 2013-09-01T02:12:25.553 回答
1

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

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

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

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

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

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

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

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

  • 如果初始化依赖于 中的东西main,那么您需要将数组变量变成final实例变量,并在构造函数中进行初始化。

于 2013-09-01T02:15:04.057 回答
1

数组元素总是可变的。没有办法使它们成为最终的,对不起。

顺便说一句,正是由于这个原因,EnumType.values()(类型EnumType是哪里enum)总是会在返回之前防御性地复制内部值数组,因为没有办法使内部值数组不可变。

于 2013-09-01T02:17:37.437 回答
1

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

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

一般来说,java 没有大量的 -const相关类型。他们甚至没有const在他们的类型系统中包含任何类似的东西。相反,他们依靠信息隐藏来实现相同的保护。private即用or隐藏字段,protected以便人们无法从课堂外分配给它们。

于 2013-09-01T02:22:45.637 回答