Java 不变性和可读性

Java 不变性和可读性,java,immutability,readability,Java,Immutability,Readability,因此,我一直在阅读Joshua Bloch的《高效Java》,并注意到我在工作中实际遇到的两点 第1点:使setter方法更具可读性。 在他的例子中,我们有一个类,它的构造函数大得离谱。当人们实例化该类时,很难判断所有参数的情况。因此,他建议制作一个最低限度的构造函数,并为所有其他选项使用setter方法,因此,不要 MyClass clazz=新的MyClass(a、b、c、, d、 e,f,g) 你会写 MyClass clazz=新的MyClass(a、b、, c) )clazz.setd

因此,我一直在阅读Joshua Bloch的《高效Java》,并注意到我在工作中实际遇到的两点

第1点:使setter方法更具可读性。 在他的例子中,我们有一个类,它的构造函数大得离谱。当人们实例化该类时,很难判断所有参数的情况。因此,他建议制作一个最低限度的构造函数,并为所有其他选项使用setter方法,因此,不要

MyClass clazz=新的MyClass(a、b、c、, d、 e,f,g)

你会写

MyClass clazz=新的MyClass(a、b、, c) )
clazz.setdito(d)
克拉兹·塞特霍(e)
拉兹·塞特芬兹(f)
树胶球(g)

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

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

当您有一个具有巨大构造函数的不可变类时会发生什么?您不能为它创建setter方法;这将打破不变性。我试着浏览了这本书的其余部分,但我认为他没有找到解决这个问题的办法

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


有人对如何处理这个问题有什么好主意吗?我目前在工作中面临着这个问题,我有一个不可变的类,它有一个巨大的构造函数,我希望在不破坏不可变性的情况下将其重构为可读性更强的类

一个选项是提供一个单独的生成器类,该类提供setter,负责构建实际对象

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

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

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

    您可以使用fluent接口:

    另见:


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

    +1具有可链接方法的构建器实际上提高了具有
    void
    set方法的可变对象的可读性,我认为。同意。Bloch在上面提到的示例生成器中包含了可链接的setter。太棒了!我真不敢相信我错过了。我大部分时间都在浏览不变性部分,完全忘记了检查构造函数。非常正确,看起来流畅的接口和构建器的想法是一样的。非常酷的概念。真不敢相信我错过了它。让一个可变和不可变的类从公共抽象基派生出来似乎是一个有用的概念(它为所有属性宣传getter)。不可变类的构造函数可以接受基类的参数。但是,不确定如何允许可变类将抽象只读属性与读写属性相关联,而不创建实现只读属性的中间类。