java - 不变性和可读性

标签 java immutability readability

所以我一直在阅读 Joshua Bloch 的 Effective Java 并注意到我在工作中实际遇到的两点。

要点 1: 使用 setter 方法使代码更具可读性。 在他的例子中,我们有一个类有一个非常大的构造函数。当人们实例化类时,很难说出所有参数的情况。因此,他建议制作一个简约的构造函数并为所有其他选项设置设置方法,而不是...

MyClass clazz = new MyClass(a, b, c, d, e, f, g);

你会写....

MyClass clazz = new MyClass(a, b, c);
clazz.setDitto(d);
clazz.setEcho(e);
clazz.setFunzies(f);
clazz.setGumballs(g);

作为可读代码的巨大支持者,我非常喜欢它。

第 2 点:一般来说,他建议使用不可变类。他深入探讨了为什么拥有不可变类比拥有可能处于多种不同状态的类要好得多。我可以肯定地说他把这个想法卖给了我,我迫不及待地想让我从现在开始编写的大多数类都是不可变的,除了......

当你有一个带有巨大构造函数的不可变类时会发生什么?你不能为它制作 setter 方法;那会破坏不变性。我尝试浏览了本书的其余部分,但我认为他没有为此提供解决方案。

有可能一次性使用 setter 方法,但 setter 方法可用于一个被认为是不可变的类这一事实令人沮丧,即使如果您随后尝试它只会抛出异常.

有没有人对如何处理这个问题有什么好的想法?我目前在工作中遇到这个问题,我有一个带有巨大构造函数的不可变类,我想在不破坏不变性的情况下重构为更具可读性的东西。

最佳答案

一个选项是提供一个单独的构建器类,它提供 setter ,负责构造实际对象。

在 Bloch 的“Effective Java”第二版中,第 2 项针对不可变类说明了这一点。关键思想是:

  • 构建器的每个选项都有一个可变字段。
  • 构建器将自身作为单个参数传递给不可变类的构造函数。

关于java - 不变性和可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3631658/

相关文章:

java - 将文本文件读入 3d 数组

java - 通过 java servlet 实现处理邮件协议(protocol)

rust - 为什么我不能可变地移动捕获不可变变量?

c# - 如何使这段代码更具可读性?

java - 为什么这个 Java 长计算返回 NaN?

java - isInstance 和 instanceof - 为什么没有通用方法?

r - qgraph 可以在实际边缘之外渲染边缘标签吗?

c++ - 有没有更好的方法在代码中注释参数的方向?

javascript - React js 是如何保证 props 的不变性的?

immutability - 具有不可变数据结构的 RxJS?