Java 爪哇语;这";在构造函数中
这是一个非常基本的问题,我从未用java编写过代码,但我正在为一位朋友编写一个类。。。有类似于:Java 爪哇语;这";在构造函数中,java,constructor,Java,Constructor,这是一个非常基本的问题,我从未用java编写过代码,但我正在为一位朋友编写一个类。。。有类似于: class myClass{ private string name; public string getName() { return this.name; } public void setName (int newValue) { this.name = newValue; } private int n
class myClass{
private string name;
public string getName() {
return this.name;
}
public void setName (int newValue) {
this.name = newValue;
}
private int number;
public int getNumber() {
return this.number;
}
public void setNumber (int newValue) {
this.number = newValue;
}
}
我想建造这个建筑的方式是:
public myClass (string name, int numbers) {
this.name = name;
this.number = number;
}
我的问题是:
非常感谢让参数使用与字段相同的名称没有问题;
this.
显式消除歧义,程序将按预期运行
根据您的程序,使用setter而不是直接写入字段可能有利,也可能不利。如果直接在构造函数中写入值,那么就可以绕过setter中可能存在的任何运行时检查,这可能会导致对象保存通常无法保存的数据。另一方面,如果setter试图使用旧值执行某些操作,那么您可能不想调用setter,因为在构造函数中,可能没有有意义的旧值。我要说的是,在构造函数中设置字段并不比使用setter更好或更糟,只要您小心避免破坏类不变量
此
区分实例变量和同名的方法参数变量this
这个
关键字可以避免问题name
表示参数,namethis.name
表示实例字段名称
和数字
字段设置为最终字段,因此类是不可变的。根据我的经验,最好从一个不可变的类定义开始,只有在有正当需要的情况下才朝着可变的方向发展this
来区分它们。当出现名称冲突时,本地变量或参数将优先于属性
出于这个原因,我不希望每个人都有完全相同的名字,因为这很容易导致bug
2) 我还将在构造函数中使用setter,因为如果在设置时需要对参数进行验证或其他操作,您只需在一个地方进行更改。否则就是重复,违反了原则
我会:
public myClass (string name, int number) {
setName( name );
setNumber( number );
}
公共myClass(字符串名称、整数){
集合名(名称);
setNumber(数字);
}
是的,
这个。
避免了问题。有些人推荐这种方式,比如他们书中的Rogue Wave
处理这一问题的其他常见方法有:
使用前缀“m”或“m_”命名成员
private string m_name;
private int m_number;
public myClass(string name, int number) {
m_name = name;
m_number = number;
}
使用不同的名称调用参数,通常是单个字母或成员名称的缩写版本
private string name;
private int number;
public myClass(string nam, int num) {
name = nam;
number = num;
}
但是我更喜欢你现在使用
这个的方式,我真的不喜欢在字段上使用前缀。您不需要将字段名与它的类型或范围混在一起。我同意你的第二种方法。我只是提到了常见的不同风格。