我不确定之前是否曾问过类似的问题,搜索过它,但没有得到任何有用的答案。
正如问题所暗示的那样,更好的是,有重载的构造函数还是有多个setter函数?
情景:
public class Something {
private int a;
private int b;
public Something(int a, int b) {
this.a = a;
this.b = b;
}
... // Do Something
}
现在,我的基本要求是只有两个参数。现在明天,需求被更改,我被要求添加一个新参数,然后是第二天d,并给出一个声明说我们可以有更多字段。
我已经在多个项目中对此构造函数具有依赖性。现在,回到我的问题
你可以给我什么建议?
答案 0 :(得分:9)
最令人愉快的方法是继续将字段添加到构造函数中 - 拥有setter意味着你不能拥有不可变对象,并且不可变对象总是很好 - 但可能会调查builder pattern ,它可以帮助您将自己限制为只有一个被构建器对象调用并“填充”的构造函数。
答案 1 :(得分:4)
与setter相反,构造函数的优点在于它允许您强制设置实例所需的属性,而不是让对象处于错误状态,直到调用正确的setter为止。此外,正如其他海报所提到的,不变性可能是一件非常好的事情,特别是在多线程环境中。
尽管如此,你的直觉是正确的:构造者可能变得笨拙。再次推测其他海报,builder pattern可以在这种情况下为你提供最好的两个世界。如果您不希望构建器成为产品的嵌套类,如Wikipedia文章中的Java示例所示,那么只需将其放在与产品相同的包中,并为产品包提供保护的setter 。此外,当调用者声明构建完成时,您可以添加逻辑以强制设置强制属性。
答案 2 :(得分:1)
拥有不同构造函数的目的是提高类的可重用性。我认为有一些不同的构造函数可以满足您的需求而不是拥有大量的setter会更有帮助。 此外,构造函数更具体,并提高了类和api的可读性。
答案 3 :(得分:0)
依赖于2-arg构造函数的其他项目是否会以任何方式从新参数中受益? 2-arg构造函数是否符合您的新要求?
也许您需要创建另一个类,例如SomethingEx(Something)
将携带额外的字段并具有不同的构造函数,但会分享有用的方法。
如果分享的有用方法很少而且很短,那么创建一个完全不同的类可能会更好,只是为了减少依赖。