当前位置: 首页 > 知识库问答 >
问题:

我们应该使用clone还是BeanUtils.CopyProperties?为什么

唐健
2023-03-14

从外观上看-beanutils.copyproperties似乎创建了一个对象的克隆。如果是这样,那么对于实现可克隆接口(只有不可变对象是新的,因为可变对象有引用复制)的关注,哪一个是最好的,为什么?

我昨天实现了克隆,然后意识到我必须为非字符串/首字母元素提供自己的修改。然后我被告知我现在正在使用的beanutils.copyproperties。这两个实现似乎都提供了类似的功能。

谢谢

共有1个答案

桂浩言
2023-03-14

Josh Bloch提供了一些相当好的参数(包括您提供的参数),断言cloneable存在根本缺陷,而是支持复制构造函数。看这里。

我还没有遇到复制不可变对象的实际用例。您复制对象有一个特定的原因,大概是为了将一些可变对象隔离到单个事务中进行处理,保证在该处理单元完成之前没有任何东西可以改变它们。如果它们已经是不可变的,那么引用就和副本一样好。

Beanutils.copyproperties通常是一种侵入性较低的复制方式,而不必更改要支持的类,而且它在组合对象方面提供了一些独特的灵活性。

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

 类似资料:
  • 问题内容: 通过它的外观- 似乎创建了一个对象的克隆。如果是这样的话,那么与实现Cloneable接口有关的担忧(只有不可变对象才是新对象,因为可变对象复制了引用)是最好的,为什么? 昨天我实现了cloneable,然后意识到我必须对非 String / Primative 元素提供自己的修改。然后,我被告知我正在使用哪个。两种实现似乎都提供了类似的功能。 谢谢 问题答案: Josh Bloch提

  • 问题内容: 我正在一个将Angular和Underscore都作为依赖项的项目。 当我需要创建对象的副本时,根据当时的心情,我可以使用或 在我看来,这些方法中的一种可能比另一种更快速/可靠/健壮。 假设已经包含两个库,那么这两个函数中的任何一个是否存在使另一个函数更好或更坏使用的已知问题? 问题答案: 关于您的问题: angular.copy和_.clone是不同的。这不是哪个更好的问题,而是关于

  • 关于这一点的文献不多。我想知道,我们应该先打电话吗 或 在https://developers.google.com/admob/android/quick-start 尽管谷歌建议致电<code>MobileAds。尽早初始化 在加载广告之前,让您的应用通过调用MobileAds.initialize()初始化Mobile Ads SDK,MobileAds.initialize初始化SDK,并

  • 问题内容: 我正在使用c / c 为osx和linux开发命令行界面可执行文件。该项目将链接到opencv。我应该使用libc 还是libstdc ++? 问题答案: 我会为每个操作系统使用本机库,即GNU / Linux上的libstdc 和Mac OS X上的libc 。 libc 在GNU / Linux上不是100%完整的,而libstdc 更完整时使用libc并没有真正的优势。另外,如果

  • 问题内容: 和CSS 和有什么不一样?我应该使用哪一个?为什么? 问题答案: 所有这些答案似乎都是不正确的。与直觉相反,在CSS 中不是pixel 。至少不是在简单的物理意义上。 从W3C,EM,PX,PT,CM,IN…阅读本文,了解如何为CSS发明一个“神奇的”单元。的含义因硬件和分辨率而异。(该文章是最新的,最新更新为2014-10。) 我自己的思考方式: px单位是CSS的魔术单位。它与当前

  • 问题内容: 我想从文本文件中读取每一行并将它们存储在ArrayList中(每一行是ArrayList中的一项)。 到目前为止,我知道BufferedInputStream写入缓冲区,并且仅在缓冲区为空时才进行另一次读取,这可以最大程度地减少或至少减少操作系统的操作量。 我正确吗-我说得通吗? 如果以上情况是在任何情况下,任何人都想使用DataInputStream。最后,我应该使用这两个中的哪一个