150 java arrays immutability
Java中的原始数组是否有一个不可变的替代方法?制作一个原始数组final实际上并不能阻止人们做类似的事情
final int[] array = new int[] {0, 1, 2, 3};
array[0] = 42;
Run Code Online (Sandbox Code Playgroud)
我希望数组的元素不可更改.
Jas*_*n S 158
不是原始数组.您需要使用List或其他一些数据结构:
List<Integer> items = Collections.unmodifiableList(Arrays.asList(0,1,2,3));
Run Code Online (Sandbox Code Playgroud)
Col*_*inD 73
我的建议是不使用数组或unmodifiableList使用Guava的ImmutableList,它就是为此而存在的.
ImmutableList<Integer> values = ImmutableList.of(0, 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
Joa*_*uer 20
正如其他人所说,你不能在Java中拥有不可变数组.
如果您绝对需要一个返回不影响原始数组的数组的方法,那么每次都需要克隆该数组:
public int[] getFooArray() {
return fooArray == null ? null : fooArray.clone();
}
Run Code Online (Sandbox Code Playgroud)
显然这是相当昂贵的(因为你每次调用getter时都会创建一个完整的副本),但是如果你不能改变界面(List例如使用一个)并且不能让客户改变你的内部风险,那么它可能是必要的.
这种技术被称为制作防御性副本.
Bri*_*ham 14
有一种方法可以在Java中创建不可变数组:
final String[] IMMUTABLE = new String[0];
Run Code Online (Sandbox Code Playgroud)
具有0个元素(显然)的数组不能变异.
如果您使用该List.toArray方法将a转换List为数组,这实际上可以派上用场.因为即使空数组占用一些内存,您也可以通过创建一个常量空数组来保存该内存分配,并始终将其传递给该toArray方法.如果你传递的数组没有足够的空间,那么该方法将分配一个新数组,但如果确实如此(列表为空),它将返回你传递的数组,允许你在调用时重用该数组toArray.空的List.
final static String[] EMPTY_STRING_ARRAY = new String[0];
List<String> emptyList = new ArrayList<String>();
return emptyList.toArray(EMPTY_STRING_ARRAY); // returns EMPTY_STRING_ARRAY
Run Code Online (Sandbox Code Playgroud)
另一个答案
static class ImmutableArray<T> {
private final T[] array;
private ImmutableArray(T[] a){
array = Arrays.copyOf(a, a.length);
}
public static <T> ImmutableArray<T> from(T[] a){
return new ImmutableArray<T>(a);
}
public T get(int index){
return array[index];
}
}
{
final ImmutableArray<String> sample = ImmutableArray.from(new String[]{"a", "b", "c"});
}
Run Code Online (Sandbox Code Playgroud)
从 Guava 22 开始,com.google.common.primitives您可以从包中使用三个新类,与ImmutableList.
他们还有一个建筑商。例子:
int size = 2;
ImmutableLongArray longArray = ImmutableLongArray.builder(size)
.add(1L)
.add(2L)
.build();
Run Code Online (Sandbox Code Playgroud)
或者,如果大小在编译时已知:
ImmutableLongArray longArray = ImmutableLongArray.of(1L, 2L);
Run Code Online (Sandbox Code Playgroud)
这是获取 Java 原语数组的不可变视图的另一种方法。