Setters vs Java中的重载构造函数

时间:2012-03-27 01:37:33

标签: java

我不确定之前是否曾问过类似的问题,搜索过它,但没有得到任何有用的答案。

正如问题所暗示的那样,更好的是,有重载的构造函数还是有多个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,并给出一个声明说我们可以有更多字段。

我已经在多个项目中对此构造函数具有依赖性。现在,回到我的问题

  • 是否可以继续将新字段添加到已经重载的构造函数中?
  • 每次我需要添加一个新字段时创建一个新的重载构造函数,这样我就不会破坏依赖代码吗?
  • 或者只是使用默认的空默认构造函数并仅使用setter(弄乱我的不变性,这不是高度关注的问题)

你可以给我什么建议?

4 个答案:

答案 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)将携带额外的字段并具有不同的构造函数,但会分享有用的方法。

如果分享的有用方法很少而且很短,那么创建一个完全不同的类可能会更好,只是为了减少依赖。