【问题标题】:how to make objects immutable in java [duplicate]如何在java中使对象不可变[重复]
【发布时间】:2014-09-03 02:19:15
【问题描述】:

我有以下代码:

final int[] a = new int[5];
a[0] = 10;
a[0] = 5;

这段代码非常好,因为我正在修改对象而不是引用,但现在我想要这样的东西:

int[] a  = final new int[5];

所以上面的第 3 行将引发我正在尝试更改不可变数组的错误。有什么简单的方法吗?集合中有一个函数,但我不想使用任何类型的集合。

【问题讨论】:

  • 您是在问如何使数组不可变?如果是这样,那么答案是:你不能(唯一的例外是大小为0 的数组,因为它不能有任何元素,所以它不能被改变,所以它可能被认为是不可变的)。
  • “我不想使用任何类型的集合”——为什么?
  • 那是项目要求...忍不住...

标签: java arrays immutability


【解决方案1】:

有什么简单的方法吗?

使用普通数组,不。数组总是可变的,所以如果你想要这个功能,你必须包装一个数组并提供一种读取它的机制(而不是写入它的机制)。标准 JDK 类中已经有可以为您执行此操作的实用程序,如您所说的 Collections。

例如,您可以改用Collections.unmodifiableList 返回的不可修改列表。例如,要创建一个包含1、2 和3 的不可修改列表:

List<Integer> a = Collections.unmodifiableList(Arrays.asList(1, 2, 3));

如果没有某种包装器(无论是否标准),您所要求的就无法完成。

【讨论】:

  • "集合中有一个函数,但我不想使用任何类型的集合。"
  • 请注意,OP 表示他不想使用 Collections Framework。
  • @Kon 请查看修改后的答案。
  • @RafaelOsipov 请查看修改后的答案。
【解决方案2】:

如果你声明:

final int[] myarray = new int[5];

它不会像你期望的那样让你的数组不可变。引用 myarray 将是最终的,但该数组的内容可以更改。

由于您不想使用 Collections Framework,请在数组上创建自己的包装类,以防止修改其内容。它会让你的数组不可变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多