Java“this”在构造函数中

嗯,这是一个非常基本的问题,我从来没有用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; } 

我的问题:

  1. 我使用与参数相同的属性标识符。 做这个。” 避免在这里遇到麻烦?
  2. 是否更好地使用set方法,如果是这样,我应该使用“this。”?

非常感谢你

  1. 是的,它避免了名称冲突。 在构造函数的上下文中, name引用参数,名称this.name引用实例字段。
  2. 取决于“更好”的意思。 就个人而言,我会将namenumber字段设为final,因此该类是不可变的。 根据我的经验,最好从不可变的类定义开始,如果有合法的需要,只能转向可变的东西。
  1. 是的, this区分实例变量和同名的方法参数变量。
  2. 关于构造函数或setter初始化是否更好的问题一直存在争议。 如果您只是在第一次创建对象时设置名称和编号,并且以后不需要更新这些变量,那么仅使用构造函数并省略setter可能会更好。 是的,在setter中,如果您的参数与您要设置的字段具有相同的名称,则需要使用this选项。

参数使用与字段相同的名称没有问题; this. 明确地消除歧义,程序将按预期运行。

根据您的程序,使用setter而不是直接写字段可能有利也可能没有用。 如果直接在构造函数中编写值,则可以绕过setter中可能存在的任何运行时检查,这可能会导致对象保留通常无法保存的数据。 另一方面,如果你的setter试图用旧值做某事,那么你可能不想调用setter,因为在构造函数中,可能没有有意义的旧值。 我要说在构造函数中设置字段比使用setter更明显更好或更糟,只要你小心避免破坏类不变量。

  1. 是。 使用this关键字可以避免问题。

  2. 如果get / set方法中有逻辑,那么您应该使用它们。 否则,在构造函数中设置值是有效的。

1)当对象范围属性与参数名称相同时,必须使用this来区分它们。 当存在名称冲突时,本地var或参数将优先于该属性。

出于这个原因,我不喜欢每个都有完全相同的名称,因为它很容易导致错误。

2)我也会在构造函数中使用setter,因为如果在设置时需要对参数进行validation或其他操作,则只需在一个地方进行更改。 否则它是重复并违反DRY(不要重复自己)原则。

我会做:

 public myClass(s​​tring name,int number){
     setName(name);
     setNumber(number);
 }

是的, this. 避免问题。 有些人推荐这种方式,比如Rogue Wave在他们的书“ The Elements of Java Style”中 。

其他常见的处理方法是:

名称成员带有“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; } 

但我更喜欢你现在使用的方式。