问题
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
但是使用Guava的ImmutableList,它就是为了这个目的而存在的。
ImmutableList<Integer> values = ImmutableList.of(0, 1, 2, 3);
#3 热门回答(19 赞)
正如其他人所说,你不能在Java中拥有不可变数组。
如果你绝对需要一个返回不影响原始数组的数组的方法,那么每次都需要克隆该数组:
public int[] getFooArray() {
return fooArray == null ? null : fooArray.clone();
}
显然这是相当昂贵的(因为你每次调用getter时都会创建一个完整的副本),但是如果你不能改变界面(例如使用aList
)并且不能让客户改变你的内部风险,那么它可能是必要的。
这种技术被称为制作防御性副本。