有没有办法让Java中的普通数组不可变?

时间:2013-06-15 11:09:01

标签: java arrays

用Google搜索,找到了大量的代码。但是他们中的任何一个都给了我想要的东西。我想制作一个普通的数组Immutable。我试过这个:

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] ...有没有办法让这个数组不可变?

3 个答案:

答案 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的实例包含自己的私有数据,永远不会更改。