如何在java中使对象不可变

如何在java中使对象不可变,java,arrays,immutability,Java,Arrays,Immutability,我有以下代码: final int[] a = new int[5]; a[0] = 10; a[0] = 5; 这段代码非常好,因为我正在修改对象,而不是引用,但现在我想要这样的代码: int[] a = final new int[5]; 所以上面的第3行将触发一个错误,我正试图更改不可变数组。有什么简单的方法吗?集合中有一个函数,但我不想使用任何类型的集合。如果您声明: final int[] myarray = new int[5]; 它不会像您期望的那样使数组不可变。参考mya

我有以下代码:

final int[] a = new int[5];
a[0] = 10;
a[0] = 5;
这段代码非常好,因为我正在修改对象,而不是引用,但现在我想要这样的代码:

int[] a  = final new int[5];

所以上面的第3行将触发一个错误,我正试图更改不可变数组。有什么简单的方法吗?集合中有一个函数,但我不想使用任何类型的集合。

如果您声明:

final int[] myarray = new int[5];
它不会像您期望的那样使数组不可变。参考
myarray
将是最终的,但此数组的内容可以更改

由于您不想使用集合框架,请在数组上创建自己的包装器类,以防止修改其内容。它将使您的数组不可变

有什么简单的方法吗

对于普通数组,不会。数组总是可变的,因此如果您想要此功能,您必须包装一个数组并提供一个读取它的机制(而不是写入它的机制)。标准JDK类中已经有一些实用程序可以为您实现这一点,如您所说的
Collections

例如,您可以使用返回的不可修改列表。例如,要创建包含
1
2
3
的不可修改列表:

List<Integer> a = Collections.unmodifiableList(Arrays.asList(1, 2, 3));
List a=Collections.unmodifiableList(Arrays.asList(1,2,3));

如果没有某种包装器(无论是标准的还是非标准的),您所要求的就无法完成。

您是在问如何使数组不可变吗?如果是这样的话,答案是:你不能(唯一的例外是数组的大小
0
,因为它不能有任何元素,所以它不能被更改,所以它可能被认为是不可变的)。“我不想使用任何类型的集合”--为什么?这是项目要求。。。“集合中有一个函数,但我不想使用任何类型的集合。”请注意,OP表示他不想使用集合框架。@Kon请查看修订后的答案。@RafaelOsipov请查看修订后的答案。