每当我创建一个新类时,我都想知道什么是创建构造函数的最佳方法。如果我使用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字段,这是您唯一的选择。

10-06 01:07