我是Java的新手,对深度复制感到非常困惑。
我认为每个将一些可变对象作为参数并返回与输入相关的对象的方法应该生成防御性副本。但是,经过一些编码后我觉得这很棘手。
例如,我想从满足某些条件的容器中选择一些对象,并将它们作为较小的容器返回:
List<SomeType> chooseWithSomeCondition(List<SomeType> input)
但SomeType
是由其他人定义的,它不是不可变的,不可克隆,不可序列化,也没有任何复制构造函数。由于Java的final
也无法帮助,我不知道如何在这里进行深层复制。
我的标准是否过于严格?我读过的代码有问题吗?还有其他方法可以制作深层复制吗?请分享您的想法,并提前感谢。
答案 0 :(得分:1)
对于不能使用普通复制方法进行深层复制的类型(在非可序列化,不可克隆,不可实例化的情况下......),您需要使用反射。< / p>
如果您认为反射太慢,或者无法使用构造函数,那么您可能需要考虑使用sun.misc.Unsafe
进行实例化。
答案 1 :(得分:1)
在这种特殊情况下,代码是有问题的,我只是做一个浅拷贝。在你的文档中,请注意该方法实际上是“chooseWithSomeConditionAtThisInstant”,并告诉其他人不要修改任何列表的元素,或者小心谨慎地这样做。 (有些用例想要更改通过。)