所以我一直在阅读Joshua Bloch撰写的Effective
Java,并注意到我在工作中遇到的两点.
第1点:制作setter方法以使代码更具可读性.
在他的例子中,我们有一个带有一个非常庞大的构造函数的类.当人们实例化这个类时,很难说出所有参数都在发生什么.因此,他建议制作一个简约的构造函数,并为所有其他选项设置setter方法,因此不是……
MyClass clazz = new MyClass(a,b,c,
d,e,f,g);
你会写….
MyClass clazz = new MyClass(a,
c);
clazz.setDitto(d);
clazz.setEcho(e);
clazz.setFunzies(f);
clazz.setGumballs(g);
第2点:一般来说,他建议使用不可变类.他深入研究了为什么不可变类比拥有可能处于几个不同状态的类要好得多.我可以肯定地说他把这个想法卖给了我,我迫不及待地想把我从现在开始写的大部分课程变成一成不变的,除了….
当你有一个带有巨大构造函数的不可变类时会发生什么?你不能为它制作setter方法;这将破坏不变性.我试着浏览本书的其余部分,但我不认为他为此提供了解决方案.
有可能使用一次性使用setter方法,但只是一个setter方法可用于一个被认为是不变的类的事实令人沮丧,即使它只是在你后续尝试时抛出异常.
有没有人对如何处理这个问题有任何好的想法?我目前正在处理这个问题,我有一个带有巨大构造函数的Immutable类,我想重构一些更易读的东西,而不会破坏不变性.
解决方法
一种选择是提供一个单独的构建器类,它提供了setter,它负责构造实际的对象.
在Bloch的第二版“Effective Java”中,第2项为不可变类说明了这一点.关键的想法是:
>构建器为每个选项都有一个可变字段.>构建器将自身作为单个参数传递给不可变类的构造函数.