我们应该使用clone还是BeanUtils.copyProperties以及为什么
问题内容:
通过它的外观-
BeanUtils.copyProperties
似乎创建了一个对象的克隆。如果是这样的话,那么与实现Cloneable接口有关的担忧(只有不可变对象才是新对象,因为可变对象复制了引用)是最好的,为什么?
昨天我实现了cloneable,然后意识到我必须对非 String / Primative
元素提供自己的修改。然后,我被告知BeanUtils.copyProperties
我正在使用哪个。两种实现似乎都提供了类似的功能。
谢谢
问题答案:
Josh
Bloch提供了一些相当不错的参数(包括您提供的参数),它们断言了Cloneable
从根本上来说是有缺陷的,而偏向于使用复制构造函数。看这里。
我还没有遇到用于复制不可变对象的实际用例。您出于特定原因而复制对象,大概是为了将一组可变对象隔离到单个事务中进行处理,从而确保在该处理单元完成之前,不会有任何更改。如果它们已经是不可变的,则引用与副本一样好。
BeanUtils.copyProperties
通常是一种不那么麻烦的复制方式,而无需更改要支持的类,并且它在组合对象方面提供了一些独特的灵活性。
也就是说,copyProperties
并不总是一刀切。在某些时候,您可能需要支持包含具有专用构造函数但仍然可变的类型的对象。您的对象可以支持内部方法或构造函数来解决这些异常,也可以将特定类型注册到某个外部工具中进行复制,但它甚至无法到达某些地方clone()
。很好,但仍有局限性。