【问题标题】:Immutability and Readability不变性和可读性
【发布时间】:2010-09-02 22:08:51
【问题描述】:

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

第 1 点: 制作 setter 方法以使代码更具可读性。 在他的例子中,我们有一个类有一个非常大的构造函数。当人们实例化该类时,很难判断所有参数发生了什么。因此,他建议制作一个简约的构造函数,并为所有其他选项设置 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 方法可用于假定为不变性的类这一事实令人沮丧,即使如果您随后尝试它确实会抛出异常.

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

【问题讨论】:

  • 这似乎是一个有用的概念,即从一个通用抽象基(它为所有属性宣传 getter)派生一个可变和不可变类。不可变类的构造函数可以接受基类的参数。不知道如何允许可变类使用读写属性来隐藏抽象的只读属性,但不创建实现只读属性的中间类。

标签: java immutability readability


【解决方案1】:

一种选择是提供一个单独的构建器类,该构建器类提供了负责构造实际对象的设置器。

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

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

【讨论】:

  • +1 在我看来,具有可链接方法的构建器实际上提高了具有 void 设置方法的可变对象的可读性。
  • 同意。 Bloch 在上面提到的示例构建器中包含可链接的设置器。
  • 太棒了!我不敢相信我错过了。我主要是在浏览不变性部分,完全忘记检查构造函数。
【解决方案2】:

Introduce Parameter Object,也许吧?它可以解决问题,但可能以有用的方式。您的参数对象不需要任何方法;它只是保存数据,你设置它,而不是你的真实班级。然后你的真实类通过参数对象在构造函数中初始化自己。

【讨论】:

    【解决方案3】:

    【讨论】:

    • 说的很对,看来流畅的界面和builder的想法是一样的。很酷的概念。不敢相信我错过了。
    【解决方案4】:

    如果有一个抽象基类,它支持getter,但不支持类的所有属性的setter,一个派生的密封“不可变”类,其构造函数接受一个基类对象,以及一个包含所有setter的派生可变类。属性?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      相关资源
      最近更新 更多