嗯,这是一个非常基本的问题,我从来没有用java编写代码,但是我正在为朋友写一个类......有类似的东西:
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;
}
我的问题:
非常感谢
答案 0 :(得分:6)
name
引用参数,名称this.name
引用实例字段。name
和number
字段设为final,因此该类是不可变的。根据我的经验,最好从不可变的类定义开始,如果有合法的需要,只能转向可变的东西。答案 1 :(得分:2)
this
区分实例变量和同名方法参数变量。this
。答案 2 :(得分:1)
使用与字段相同的名称参数没有问题; this.
明确消除歧义,程序将按预期运行。
根据您的程序,使用setter而不是直接写字段可能有利也可能没有用。如果直接在构造函数中编写值,则可以绕过setter中可能存在的任何运行时检查,这可能会导致对象保留通常无法保存的数据。另一方面,如果你的setter试图用旧值做某事,那么你可能不想调用setter,因为在构造函数中,可能没有有意义的旧值。我要说在构造函数中设置字段比使用setter更明显更好或更糟,只要你小心避免破坏类不变量。
答案 3 :(得分:1)
是。使用this
关键字可避免出现问题。
如果get / set方法中有逻辑,那么您应该使用它们。否则,在构造函数中设置值是有效的。
答案 4 :(得分:1)
1)当对象范围属性与参数名称相同时,必须使用this
来区分它们。当存在名称冲突时,本地var或参数将优先于该属性。
出于这个原因,我不希望每个人都有完全相同的名称,因为它很容易导致错误。
2)我也会在构造函数中使用setter,因为如果在设置时需要对参数进行验证或其他操作,则只需在一个地方进行更改。否则它会重复并违反DRY (Don't Repeat Yourself)原则。
我愿意:
public myClass (string name, int number) { setName( name ); setNumber( number ); }
答案 5 :(得分:0)
是的,this.
避免了问题。有些人推荐这种方式,比如他们的书The Elements of Java Style中的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;
}
但我更喜欢你现在使用this
的方式。