java - 如何避免副作用?

标签 java side-effects

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

避免副作用仅在多线程环境中才真正重要,但仍然是一个好的实践。 f(X)=Y ,能够比较两个对象,即您收到的作为参数的对象和您给出的作为结果的对象,这是一件好事。

这意味着,我需要将 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());

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

是否有一些使用反射的通用方法将一个对象映射到另一个对象?这在性能方面代价高昂。

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

最佳答案

  1. 您可能想看看CloneableObject.clone()。如果对象的浅拷贝就足够了,那么您不需要编写任何额外的代码。 Object.clone() 将为您完成此操作。
  2. 确保您确实想要/需要这种方法。如果您不确定否则会发生什么/是否会产生副作用,请检查您的代码以找出答案。
  3. 保持一致。不要在实现中混合复制和修改操作。
  4. 考虑一下如果将来您或某人想要使用您的 GroundCertificate 的后代,需要做什么。

关于java - 如何避免副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7919468/

相关文章:

java - java库代码在 "normal"处理过程中throw和catch很多异常正常吗?

java - 在 Java 中使用不纯函数迭代 Collection 的最佳实践

c# - 如何限制表达式访问 Roslyn 中的外部类型?

macros - 宏应该有副作用吗?

RxJs:如何将两个 observable 组合成一个不同类型的新 observable

python - 是否有一种可接受的方法让函数从参数中弹出一个值?

java - Java 8 中 "If/Throw, Else/Return"逻辑的简写?

java - 识别两个不同的线程

java - 似乎无法弄清楚如何使用 primefaces 重定向到 .xhtml

从 Web 服务器下载文件时出现 java.lang.IllegalStateException servlet 异常