【问题标题】:Is there any way to make an ordinary array immutable in Java?有没有办法在 Java 中使普通数组不可变?
【发布时间】:2013-06-15 11:09:00
【问题描述】:

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

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] ...有什么方法可以使这个数组不可变?

【问题讨论】:

  • 与 C 不同,你不能。但是,您可以使用包装器。
  • 让你的数组变量最终只会阻止分配一个新数组给它。据我所知,没有办法让它的值最终。
  • 为什么不使用 ArrayList 或创建自己的包装器?
  • @zerocool 它可能是元素的集合,但不是 JDK 定义的 Collection

标签: java arrays


【解决方案1】:

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

您必须为其创建一个包装器,以便在 .set() 上引发异常,但再多的包装都不允许您在以下位置引发异常:

array[0] = somethingElse;

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

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

【讨论】:

    【解决方案2】:

    原始数组是不可能的。

    您必须像在代码中那样使用Collections.unmodifiableList()

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 但是,OP 说“最终结果”不能是 Collection... 否则,是的,Guava 的 Immutable* 摇滚。
      猜你喜欢
      • 1970-01-01
      • 2011-09-08
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 2018-01-05
      • 1970-01-01
      相关资源
      最近更新 更多