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

Gre*_*reg 2 java oop

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

A和B之间有一些很大的区别吗?

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

例A:

public Model(int modelNumber) {
    this.modelNumber = modelNumber;
}
Run Code Online (Sandbox Code Playgroud)

例B

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

}

public void setModelNumber(int modelNumber) {
    this.modelNumber = modelNumber;
}
Run Code Online (Sandbox Code Playgroud)

biz*_*lop 7

除非您的班级被标记为final,否则当前形式的示例B肯定是错误的.

您需要遵循的原则是您不能从构造函数中调用可重写的方法.如果您不遵守该规则,则无法维护类不变量:您不能保证子类不会更改内容setModelNumber(),并且您最终可能会得到一个modelNumber尚未初始化为期望值的字段.

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

因此,通常最好直接从构造函数设置字段.不仅如此,在final字段的情况下,这是您唯一的选择.


sam*_* sy 6

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

所以答案是否定的!不要使用例B!
干杯!