每次我创建一个新类我都想知道创建构造函数的最佳方法是什么.如果我使用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; }
biziclop.. 7
除非您的班级被标记为final
,否则当前形式的示例B肯定是错误的.
您需要遵循的原则是您不能从构造函数中调用可重写的方法.如果您不遵守该规则,则无法维护类不变量:您不能保证子类不会更改内容setModelNumber()
,并且您最终可能会得到一个modelNumber
尚未初始化为期望值的字段.
不遵循这一原则可能带来其他不太明显但同样具有破坏性的后果.
因此,通常最好直接从构造函数设置字段.不仅如此,在final
字段的情况下,这是您唯一的选择.
除非您的班级被标记为final
,否则当前形式的示例B肯定是错误的.
您需要遵循的原则是您不能从构造函数中调用可重写的方法.如果您不遵守该规则,则无法维护类不变量:您不能保证子类不会更改内容setModelNumber()
,并且您最终可能会得到一个modelNumber
尚未初始化为期望值的字段.
不遵循这一原则可能带来其他不太明显但同样具有破坏性的后果.
因此,通常最好直接从构造函数设置字段.不仅如此,在final
字段的情况下,这是您唯一的选择.
示例A是更优选的.创建对象的那一刻,您需要调用构造函数来初始化类成员的值,setter和getter用于代码中的其他函数以使用相同的成员!考虑示例A变得非常重要.如果要继承此类,则无法执行调用setter.你不能让你的班级不可继承.
所以答案是否定的!不要使用例B!
干杯!