我应该用setter创建一个构造函数

时间:2015-12-03 12:57:55

标签: java oop

每次我创建一个新类时,我想知道创建构造函数的最佳方法是什么。如果我使用IntelliJ中的默认构造函数,它将创建一个像示例A的构造函数。但在学校我们学会使用方法B。

A和B之间是否存在一些重大差异。

是否有一些首选方式或只是程序员的选择?

示例A:

public Model(int modelNumber) {
    this.modelNumber = modelNumber;
}

例B

public Model(int modelNumber) {
    setModelNumber(modelNumber);

}

public void setModelNumber(int modelNumber) {
    this.modelNumber = modelNumber;
}

3 个答案:

答案 0 :(得分:7)

除非您的课程标记为final,否则当前形式的示例B肯定是错误的。

您需要遵循的原则是您不能从构造函数中调用可重写的方法。如果您不遵守该规则,则无法维护类不变量:您无法保证子类不会更改setModelNumber()所做的事情,您最终可以modelNumber字段尚未初始化为预期值。

如果不遵循这一原则,可能会带来其他不太明显但同样具有破坏性的consequences

因此,通常最好直接从构造函数设置字段。不仅如此,对于final字段,这是您的唯一选项。

答案 1 :(得分:6)

更优选示例A,您创建对象时需要调用构造函数来初始化类成员的值,setter和getter用于代码中的其他函数以使用相同的成员!考虑示例A变得非常重要。如果要继承此类,则无法执行调用setter。你不能让你的班级不可继承。

所以答案是 NO!不要使用例B!为干杯!

答案 2 :(得分:1)

我绝对同意

的想法
  

你不能从构造函数"

中调用可重写的方法

as biziclop user said,所以尽量避免B的例子!

另外,B的例子比A贵。想想处理器。它不必直接转到类属性modelNumber,而是首先转到setModelNumber方法。在那里,它必须使用指定的modelNumber设置。最后,两个例子都是相同的,但A更直接,更有效。