【问题标题】:" Suppose you are passing or returning an array of references to mutable objects to/from a method..."“假设您正在向/从方法传递或返回对可变对象的引用数组......”
【发布时间】:2013-11-11 15:16:59
【问题描述】:

“假设您正在向/从方法传递或返回对可变对象的引用数组。仅制作引用副本是否安全?制作浅拷贝是否安全?”

这是我班上的一个学习问题,答案是“两者都不安全。在这种情况下,只有深拷贝是安全的。”

这是为什么?

【问题讨论】:

  • 已经出现的答案突出表明,“浅拷贝”和“深拷贝”的意思并不完全清楚 “深拷贝”的意思是“一个新数组,其元素是 与旧数组的元素相同(即相同的引用)”或“一个新数组,其元素是对旧数组元素的副本的对象的引用” ?

标签: java deep-copy mutable


【解决方案1】:

“安全”可能意味着很多事情,但在您的特定上下文中,它是关于“您的”私有数据的安全性(文本将“您”称为某个 Java 类的作者)。如果您让您的班级的客户在您背后访问和修改它,您的私人数据就不会安全。

因此:

  1. 如果返回一个可变对象数组,则必须复制所有这些对象并将它们返回到一个新数组中;

  2. 如果你得到一个传入的可变对象数组,你必须再次将它们全部复制并放入一个新数组中——因为你的客户端已经引用了他传入的对象。

    李>

在实践中,所有这些都需要大量的 CPU 工作并占用内存,因此很少这样做。您要么将一切设计为不可变,要么忍受可变对象固有的危险。

【讨论】:

    【解决方案2】:

    如果您的对象是可变的,这意味着任何引用它们的客户端都可以修改它们。这可能导致竞争条件、死锁和其他不好玩的行为。但是,如果您在使用对象之前制作对象的深层副本,您将有效地使用对象的快照。这确保没有其他客户端能够修改它们,从而消除了任何并发性或正确性问题。

    【讨论】:

      【解决方案3】:

      在第一种情况下,原始数组元素和对象都可以修改。在第二种情况下,只能修改对象,因为我们不再可以访问原始数组。如果您执行深度复制,我们将使用完全不同的数组和对象,所以它当然是安全的。

      【讨论】:

      • 在这种情况下,“安全”到底是什么意思?
      • 这是我要问你的。 :) 这取决于,但在这种情况下,我假设在使用数组和对象的代码之外进行任何类型的修改。
      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多