每当我创建一个新类时,我都想知道什么是创建构造函数的最佳方法。如果我使用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;
}
最佳答案
除非您的班级被标记为final
,否则当前形式的示例B肯定是错误的。
您需要遵循的原则是,您不得从构造函数中调用可覆盖的方法。如果您不遵守该规则,那么您将无法维护类不变式:您无法保证子类不会更改setModelNumber()
所做的事情,并且最终可能会出现一个modelNumber
字段,初始化为期望值。
不遵循此原则可能会带来其他一些不太明显但也同样具有破坏性的consequences。
因此,通常最好直接从构造函数中设置字段。不仅如此,对于final
字段,这是您唯一的选择。