Java中的不可变数组

问题

Java中的原始数组是否有一个不可变的替代方法?制作一个原始的arrayfinal实际上并没有阻止一个人做类似的事情

final int[] array = new int[] {0, 1, 2, 3};
array[0] = 42;

我希望数组的元素不可更改。


#1 热门回答(137 赞)

不是原始数组。你需要使用List或其他一些数据结构:

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

#2 热门回答(66 赞)

我的建议是不使用数组或aunmodifiableList但是使用GuavaImmutableList,它就是为了这个目的而存在的。

ImmutableList<Integer> values = ImmutableList.of(0, 1, 2, 3);

#3 热门回答(19 赞)

正如其他人所说,你不能在Java中拥有不可变数组。

如果你绝对需要一个返回不影响原始数组的数组的方法,那么每次都需要克隆该数组:

public int[] getFooArray() {
  return fooArray == null ? null : fooArray.clone();
}

显然这是相当昂贵的(因为你每次调用getter时都会创建一个完整的副本),但是如果你不能改变界面(例如使用aList)并且不能让客户改变你的内部风险,那么它可能是必要的。

这种技术被称为制作防御性副本。