我们应该使用clone还是BeanUtils.copyProperties以及为什么


问题内容

通过它的外观-
BeanUtils.copyProperties似乎创建了一个对象的克隆。如果是这样的话,那么与实现Cloneable接口有关的担忧(只有不可变对象才是新对象,因为可变对象复制了引用)是最好的,为什么?

昨天我实现了cloneable,然后意识到我必须对非 String / Primative
元素提供自己的修改。然后,我被告知BeanUtils.copyProperties我正在使用哪个。两种实现似乎都提供了类似的功能。

谢谢


问题答案:

Josh
Bloch提供了一些相当不错的参数(包括您提供的参数),它们断言了Cloneable从根本上来说是有缺陷的,而偏向于使用复制构造函数。看这里

我还没有遇到用于复制不可变对象的实际用例。您出于特定原因而复制对象,大概是为了将一组可变对象隔离到单个事务中进行处理,从而确保在该处理单元完成之前,不会有任何更改。如果它们已经是不可变的,则引用与副本一样好。

BeanUtils.copyProperties 通常是一种不那么麻烦的复制方式,而无需更改要支持的类,并且它在组合对象方面提供了一些独特的灵活性。

也就是说,copyProperties并不总是一刀切。在某些时候,您可能需要支持包含具有专用构造函数但仍然可变的类型的对象。您的对象可以支持内部方法或构造函数来解决这些异常,也可以将特定类型注册到某个外部工具中进行复制,但它甚至无法到达某些地方clone()。很好,但仍有局限性。