2012-03-27 55 views
5

我不确定以前是否有过类似的问题,但是没有得到任何有用的答案。Setter vs 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 
} 

现在,我的基本要求是只有两个参数。现在明天,要求被改变了,我被要求添加一个新的参数c,然后在第二天d,并给出一个声明说我们可以有更多的字段。

我已经有这个构造函数在多个项目的依赖项。现在,回到我的问题

  • 是否建议继续添加新的字段到已经重载的构造函数?
  • 每次我需要添加一个新字段以便不中断相关代码时,创建一个新的重载构造函数?
  • 或者只使用默认空的默认构造函数,并且只使用setter方法(搞乱了我的不变性,这是高度关注的不是)

是什么,你可以给我的建议吗?

+4

“弄乱了我的不变性,这不是高度关注的问题”如果你已经努力使某个类不可变(因此更容易推理),不要轻易放弃这个工作。 – 2012-03-27 01:39:44

+1

'......有什么更好的,有一个重载的构造函数或有多个setter函数?“”是“。但严重的是,这一切都取决于上下文。有时你需要两者,有时你需要在JavaBeans限制内工作,... – 2012-03-27 01:40:14

回答

9

最好的方法是继续添加字段到你的构造函数中 - 让setter意味着你不能拥有不可变的对象,而不可变的对象总是很好 - 但可能调查builder pattern,它可以帮助你限制一个构造函数被构建器对象调用和“填充”。

+1

构造函数/方法重载可能会让人困惑。生成器模式有时很有用(+1) – 2012-03-27 01:50:48

1

拥有不同构造函数的目的是提高类的可重用性。我认为有几个不同的构造函数可以满足您的需求,而不是有很多setter,这会更有帮助。 此外,构造函数更具体,并提高您的类和api的可读性。

+0

实际上,就API可读性和可重用性而言,setter具有优势,IMO。您可以选择并设置要设置的内容,每个看到调用它们的代码的人都知道他们在做什么,而不是看到构造函数的第一个和第二个字符串参数,并想知道它们应该是什么,哪个是哪个。 – trutheality 2012-03-27 02:44:12

4

与构造函数相比,构造函数的好处在于它允许您为实例强制实施所需属性的设置,而不是让对象处于不良状态,直到调用正确的设置器为止。另外,正如其他海报所提到的,不变性可能是一件非常好的事情,特别是在多线程环境中。

尽管如此,你的直觉是正确的:建设者可能变得笨拙。再次推出其他海报,builder pattern可以在这种情况下给你两全其美。如果您不希望构建器成为产品的嵌套类(如Wikipedia文章中的Java示例所示),那么只需将它与产品放在同一个包中,然后将产品包保护的设置器。另外,当调用者声明构建完成时,您可以添加逻辑来强制强制属性的设置。

0

您的其他项目是否依赖于2参数构造函数以任何方式从新参数获益? 2-arg构造函数对你的新需求有意义吗?

也许您需要创建另一个课程,例如SomethingEx(Something)它将携带附加字段并具有不同的构造函数,但会共享有用的方法。

如果有用的共享方法很少很短,最好创建一个完全不同的类,以减少依赖关系。