当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我应该用setter创建一个构造函数》经验,为你挑选了2个好方法。

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



1> biziclop..:

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

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

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

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



2> sameera sy..:

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

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

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有