如何在java中使对象不可变

时间:2014-07-12 16:28:24

标签: java arrays immutability

我有以下代码:

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

这段代码完全正常,因为我正在修改对象而不是引用,但现在我想要这样的东西:

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

因此上面的第3行将触发我正在尝试更改不可变数组的错误。有没有简单的方法呢?集合中有一个函数,但我不想使用任何类型的集合。

2 个答案:

答案 0 :(得分:2)

  

有没有简单的方法呢?

使用普通数组,没有。数组总是可变的,所以如果你想要这个功能,你必须包装一个数组并提供一个读取它的机制(而不是一个用于写入它的机制)。标准JDK类中已经存在可以为您执行此操作的实用程序,如您所述的Collections中所示。

例如,您可以使用Collections.unmodifiableList返回的不可修改列表。例如,要创建包含123的不可修改列表:

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

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

答案 1 :(得分:1)

如果您声明:

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

它不会像你期望的那样使你的数组​​不可变。引用myarray将是最终的,但可以更改此数组的内容。

由于您不想使用Collections Framework,请在您的数组上创建自己的包装类,以防止修改它的内容。它会使你的数组​​不可变。