每次我创建一个新类时,我想知道创建构造函数的最佳方法是什么。如果我使用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;
}
答案 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更直接,更有效。