为了账号安全,请及时绑定邮箱和手机立即绑定

添加时克隆元素的Java列表

添加时克隆元素的Java列表

12345678_0001 2022-12-28 16:29:41
是否有实现 List 接口并在将元素添加到列表时克隆元素的 Java 类?这样做的目的是将此列表封装为一个对象。当然,我自己写一个很容易,比如,将 ArrayList 包装在另一个类中,然后在实现 add 和 get 方法时调用 clone 方法。但是,我想我会询问 Java 是否已经提供了这样一个类,并有可能为自己节省一些繁琐的编码。
查看完整描述

2 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

我怀疑是否存在,原因有几个:

  1. 那应该如何列出克隆元素?Object.clone()仅适用于实现的类型@Cloneable;当它工作时,它只做一个浅拷贝(例如,如果对象有一个List字段,它会克隆对列表对象的引用,而不是它的元素);打败它自己的目的。有关 Java 克隆问题的信息。因此,要使克隆真正起作用,可克隆类型需要Object.clone()使用适当的实现来覆盖。这意味着您的“克隆列表”需要知道包含的类型clone()是否正确实现,即使它成功实现了,它也只对一组非常有限的类型有用。

  2. 对于实际实现 的类型,执行而不是clone()相当简单。带有第 1 点中提到的注意事项的全新类型的列表,只是为了让我们免于输入 8 个字符,这似乎不是一个非常有用的东西。list.add(elem.clone())list.add(elem)


查看完整回答
反对 回复 2022-12-28
?
达令说

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 接口带来的所有问题,您可以创建自己的接口,该接口更适合您的应用程序。


查看完整回答
反对 回复 2022-12-28
  • 2 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信