import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class test {
public static void main(String[] args) {
final Integer array[];
List<Integer> temp = new ArrayList<Integer>();
temp.add(Integer.valueOf(0));
temp.add(Integer.valueOf(2));
temp.add(Integer.valueOf(3));
temp.add(Integer.valueOf(4));
List<Integer> immutable = Collections.unmodifiableList(temp);
array = immutable.toArray(new Integer[immutable.size()]);
for(int i=0; i<array.length; i++)
System.out.println(array[i]);
array[0] = 5;
for(int i=0; i<array.length; i++)
System.out.println(array[i]);
}
}
但它不起作用,我可以将5分配给数组[0] ...有没有办法让这个数组不可变?
答案 0 :(得分:5)
如果您想将其用作数组,则不能。
你必须为它创建一个包装器,这样就可以在.set()
上抛出一个异常,但是没有任何包装可以让你抛出异常:
array[0] = somethingElse;
当然,元素的不变性完全是另一回事!
注意:抛出不支持的操作的标准异常恰当地命名为UnsupportedOperationException
;因为它未经检查,您不需要在方法的throws
子句中声明它。
答案 1 :(得分:3)
原始数组是不可能的。
您必须像在代码中一样使用Collections.unmodifiableList()
。
答案 2 :(得分:1)
您还可以使用Guava's ImmutableList,这是一种高性能,不可变的随机访问List实现,不允许使用null元素。与Collections.unmodifiableList(java.util.List)
不同,{{1}}是一个可以更改的单独集合的视图,ImmutableList的实例包含自己的私有数据,永远不会更改。