所以我一直在阅读Joshua Bloch撰写的Effective Java,并注意到我在工作中遇到的两点 .
Point 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(克);
作为可读代码的巨大支持者,我非常喜欢 .
Point 2: 一般来说,他建议使用不可变类 . 他深入研究了为什么不可变类比拥有可能处于几个不同状态的类要好得多 . 我可以肯定地说他把这个想法卖给了我,我迫不及待地想把我从现在开始写的大部分课程变成一成不变的,除了....
当你有一个带有巨大构造函数的不可变类时会发生什么?你不能为它制作setter方法;这将破坏不变性 . 我试着浏览本书的其余部分,但我不认为他为此提供了解决方案 .
有可能使用一次性使用setter方法,但只是一个setter方法可用于一个被认为是不变的类的事实令人沮丧,即使它只是在你后续尝试时抛出异常 .
有没有人对如何处理这个问题有任何好的想法?我目前正在处理这个问题,我有一个带有巨大构造函数的Immutable类,我想重构一些更易读的东西,而不会破坏不变性 .
4 回答
一种选择是提供一个单独的构建器类,它提供了setter,它负责构造实际的对象 .
在Bloch的第二版“Effective Java”中,第2项为不可变类说明了这一点 . 关键的想法是:
构建器为每个选项都有一个可变字段 .
构建器将自身作为单个参数传递给不可变类的构造函数 .
Introduce Parameter Object,也许?它可以解决问题,但可能有用 . 你的参数对象不需要方法;它只保存数据,然后设置它,而不是真正的类 . 然后,您的真实类通过参数对象在构造函数中初始化 .
您可以使用流畅的界面:Building big, immutable objects without using constructors having long parameter lists
也可以看看:
Constructor Parameters - Rule of Thumb
Having one request object as a Method Signature parameter, which constitute all the required parameters
如何拥有一个支持getter的抽象基类,但没有为类的所有属性设置setter,派生密封的“immutable”类,其构造函数接受基类对象,以及派生的可变类,其中包含所有属性的setter?