2 回答
TA贡献1804条经验 获得超7个赞
我怀疑是否存在,原因有几个:
那应该如何列出克隆元素?
Object.clone()
仅适用于实现的类型@Cloneable
;当它工作时,它只做一个浅拷贝(例如,如果对象有一个List
字段,它会克隆对列表对象的引用,而不是它的元素);打败它自己的目的。有关 Java 克隆问题的信息。因此,要使克隆真正起作用,可克隆类型需要Object.clone()
使用适当的实现来覆盖。这意味着您的“克隆列表”需要知道包含的类型clone()
是否正确实现,即使它成功实现了,它也只对一组非常有限的类型有用。对于实际实现 的类型,执行而不是
clone()
相当简单。带有第 1 点中提到的注意事项的全新类型的列表,只是为了让我们免于输入 8 个字符,这似乎不是一个非常有用的东西。list.add(elem.clone())
list.add(elem)
TA贡献1821条经验 获得超6个赞
没有标准方法可以实现任何 Collection 在添加对象时自动克隆其对象。
如果你真的想要,你可以创建自己的 List 实现并使用反射来克隆每个进出的对象。当被问到这样的问题时,我从不建议您实际在 Collections 库中创建自己的实现。我认为在这种情况下实际创建您自己的实现的唯一原因是,如果您有一些其他库将 List 或 Collection 作为参数,并且您真的不希望该 Collection 的值发生变化。
还有一个选项是不实际将可变数据存储在列表中。您始终可以为要存储在集合中的数据创建不可变的实现。如果可能的话,这是我会选择的选项。如果你走这条路,你仍然必须确保数据元素是不可变的,或者List<ImmutableData>取而代之。使用List<ImmutableData>可能不是一个坏主意,但您可能必须List<? extends Data>在大多数方法签名中使用。
它可能看起来像这样:
interface Data {
String getString();
MutableData toMutable();
}
class MutableData implements Data {
String getString() {...}
void setString(String s) {...}
Data toImmutable() {...}
MutableData clone() {...}
}
class ImmutableData implements Data {...}
如果您仍然想要克隆,但不想使用反射或处理 Cloneable 接口带来的所有问题,您可以创建自己的接口,该接口更适合您的应用程序。
添加回答
举报