是否有实现列表接口的Java类,以及在将元素添加到列表中时克隆元素的Java类?这样做的目的是将这个列表封装为一个对象。
当然,通过在另一个类中获取ArrayList并包装它,然后在实现add和get方法时调用克隆方法,自己编写一个克隆方法是很容易的。但是,我想问一下,这样的类是否已经由Java提供了,并且可能为自己节省了一些繁琐的编码。
发布于 2019-06-03 17:03:34
没有标准的方法可以在添加对象时自动克隆它的对象的任何集合的实现。
如果您真的愿意,可以创建自己的List实现和使用反射来克隆每个进出对象。当问到这样的问题时,我从来不建议您在集合库中创建自己的实现。在本例中,我认为真正创建您自己的实现的唯一原因是,如果您有一些其他库,它将列表或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 {...}如果您仍然希望克隆,但不想使用反射或处理克隆接口带来的所有问题,您可以创建您自己的接口,这个接口对于您的应用程序来说更为通用。
发布于 2019-06-03 16:42:08
我怀疑其中的存在,有几个原因:
Object.clone()只对实现@Cloneable的类型起作用;当它工作时,它只做一个浅拷贝(例如,如果对象有一个List字段,它复制对列表对象的引用,而不是它的元素);违背了它自己的目的。有关Java克隆问题的信息。因此,要使克隆实际工作,可克隆类型需要用适当的实现覆盖Object.clone()。这意味着您的“克隆列表”需要知道包含的类型是否正确地实现了clone(),即使它成功地实现了,它也只对一组非常有限的类型有用。clone()的类型,执行list.add(elem.clone())而不是list.add(elem)非常简单。一个带有第1点中提到的警告的全新类型的列表,仅仅是为了避免我们输入8个字符,看起来并不是一件非常有用的事情。https://stackoverflow.com/questions/56431218
复制相似问题