请考虑以下代码段:
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
}
}
有没有办法让该子阵列最终?在阅读类似的问题时,我意识到我可以用自定义类来做到这一点,但我对使用原始类型感到好奇。
提前致谢。
答案 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
实例变量中,并在构造函数中进行初始化。
答案 2 :(得分:1)
数组元素总是可变的。抱歉,没有办法让他们成为最终的。
顺便说一下,正是由于这个原因,EnumType.values()
(其中EnumType
是enum
类型)将始终在返回之前防御性地复制内部值数组,因为没有办法使内部值数组不可变。
答案 3 :(得分:1)
请注意,final
修饰符会限制对变量的访问。它不是对变量类型的修改,而是对变量本身的修改。因此,它仅用于描述字段声明,而不是用于描述表达式或类型。
如果你希望数组中的值是不可变的(比如c ++中用const
描述的类型),你需要使用自定义类。
一般来说,java没有很多与const
相关的输入。他们甚至没有在const
类型系统中加入任何内容。相反,他们依靠信息隐藏来实现相同的保护。即使用private
或protected
隐藏字段,以便人们无法从课外分配这些字段。