9

谷歌了一下,找到了很多代码。但是他们中的任何一个都给了我想要的东西。我想让一个普通的数组不可变。我试过这个:

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 分配给 array[0] ...有没有办法使这个数组不可变?

4

3 回答 3

5

如果您想将其用作数组,则不能。

你必须为它创建一个包装器,这样你就可以抛出一个异常,比如说,.set()但是没有多少环绕将允许你抛出一个异常:

array[0] = somethingElse;

当然,元素的不变性完全是另一回事!

注意:为不受支持的操作抛出的标准异常被恰当地命名为UnsupportedOperationException; 由于未选中,因此您无需在方法的throws子句中声明它。

于 2013-06-15T11:16:24.030 回答
3

原始数组是不可能的。

您将不得不Collections.unmodifiableList()像在代码中那样使用。

于 2013-06-15T11:15:33.840 回答
1

您还可以使用 Guava 的 ImmutableList,这是一种不允许空元素的高性能、不可变、随机访问 List 实现。与Collections.unmodifiableList(java.util.List)仍然可以更改的单独集合的视图不同,ImmutableList 的实例包含其自己的私有数据并且永远不会更改。

于 2013-06-15T11:37:52.267 回答