0

为避免副作用:我不想在我的方法中更改参数对象属性值。我更喜欢创建一个新的来代表结果并返回它。

避免副作用仅在多线程环境中非常重要,但仍然是一个很好的实践。f(X)=Y ,能够比较两个对象是很好的,一个 u 作为参数接收,一个 u 作为结果给出。

这意味着,我需要将我的 IN 参数对象中的所有属性映射到我创建的 OUT 新实例对象。这将使一些代码像:

groundCertResult.setExpirationDate(pGroundCertificate.getExpirationDate());
groundCertResult.setValidationDate(pGroundCertificate.getValidationDate());
groundCertResult.setId(pGroundCertificate.getId());

它可以在我的方法中产生很多行:$

我也可以不用映射那么多值,只需添加一行

//use findByID without mapping that much 
final GroundCertificate groundCertResult =
    groundCertificateDao.findById(pGroundCertificate.getId());

但这最终会导致访问数据库和更多处理。

做一些使用反射的通用方法,将一个对象映射到另一个对象?在性能方面,这将是昂贵的。

你会选择什么?视项目需求而定。考虑到可维护性、可扩展性...

4

2 回答 2

1
  1. 您可能想看看CloneableObject.clone(). 如果你的对象的浅拷贝就足够了,你不需要编写任何额外的代码。Object.clone()会为你做的。
  2. 确保你真的想要/需要这种方法。如果您不确定否则可能会出现什么/是否会产生副作用,请查看您的代码以找出答案。
  3. 始终如一。不要在您的实现中混合复制和修改操作。
  4. 想想如果将来您或某人想要使用您的GroundCertificate.
于 2011-10-27T17:15:33.713 回答
0

它不仅在多线程环境中很好,尽管副作用导致问题的风险大大降低。

副作用增加了推理代码实际作用的难度。您需要确定所有可以更改状态的地方,如果不遍历所有内容并确定这些地方,就无法做到这一点。“远处的诡异动作。”

有几个库可以执行各种类型的 bean 属性复制,例如 Apache 的BeanUtils。从效率的角度来看,这是否值得取决于具体情况。

虽然这不是一种“纯粹”的方法,但我也不强烈反对返回修改后的参数对象,只要很明显原始对象正在被修改。通常情况下,无论如何我都会将参数对象设置回该值。当我不是时,我尝试通过链接某种复制功能来使代码指示。

归根结底,对我来说,一切都是为了清晰,当我被迫这样做时,我会尽可能地让清晰而不是纯粹,而且它是安全的。

于 2011-10-27T17:00:07.667 回答