【问题标题】:How to decide whether to use deep copy in Java? [closed]如何决定是否在 Java 中使用深拷贝? [关闭]
【发布时间】:2014-05-28 00:20:22
【问题描述】:

我是 Java 新手,对深拷贝感到非常困惑。

我认为每个将一些可变对象作为参数并返回与输入相关的对象的方法都应该进行防御性复制。但是,经过一些编码后,我发现这非常棘手。

例如,我想从满足某些条件的容器中选择一些对象,并将它们作为较小的容器返回: List<SomeType> chooseWithSomeCondition(List<SomeType> input) 但是SomeType是别人定义的,它不是不可变的、不可克隆的、不可序列化的,也没有任何复制构造函数。由于Java的final也帮不上忙,我不知道如何在这里进行深拷贝。

我的标准是不是太严格了?我读过的代码有问题吗?还有其他方法可以进行深度复制吗?请分享您的想法,并在此先感谢您。

【问题讨论】:

  • 你在使用线程吗?

标签: java deep-copy


【解决方案1】:

在这种特殊情况下,代码是有问题的,我只会做一个浅拷贝。在您的文档中,请注意该方法实际上是“chooseWithSomeConditionAtThisInstant”,并告诉其他人不要修改任一列表的元素,或者谨慎考虑。 (在某些用例中,您希望进行更改。)

【讨论】:

    【解决方案2】:

    对于无法使用正常复制方法进行深层复制的类型(在您的情况下是不可序列化、不可克隆、不可实例化...),您需要使用反射来解决。

    如果你觉得反射太慢,或者构造函数不能用,那么你可以考虑使用sun.misc.Unsafe来实例化。

    【讨论】:

    • 非常感谢。我读过它,它非常有用。
    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多