在Java中,为什么人们要在字段前加上“this”?

25
当引用类变量时,为什么有些人要在其前面加上this?我不是指当需要用this来消除与方法参数的歧义时,而是指当它似乎是不必要的情况下。
例如:
public class Person {        
    private String name;

    public String toString() {
        return this.name;
    }
}

toString中,为什么不能直接引用name作为name

return name;

this.name代表什么?

这里有一个StackOverflow的问题,其中的代码使用了this.

16个回答

56
  1. 防御式编程(以防将来编辑代码的人添加具有冲突名称参数或本地变量)
  2. 使代码更加 "自述性",更加明显

38
有时需要消除歧义:
public void setFoo(Bar foo) {
    this.foo = foo;
}

有时候,这只是一个风格上的问题。总的来说,我尽可能避免使用this.blah,因为它更冗长。如果你想知道,生成的字节码完全相同。


10

在语言层面上它并不做任何事情。但是它可以立即向阅读代码的人提供关于变量作用域的指示,这有助于提高对代码的理解。


我也会这么说。这样可以增加可读性,将事物放入正确的上下文中,从而避免歧义。我相信最终的字节码也是一样的。 - Kieran Senior
我认为这是主观的,并且相对于个人而言。 - Kieran Senior
这取决于情况。如果考虑到项目中的编码规范,那么可能不是这样。但如果您遵循惯例,它确实表明了变量的范围。此外,类上的静态变量应始终使用类名进行引用。 - Joseph Daigle
代码会变得混乱,你应该使用一款可以区分局部变量和实例变量颜色的 IDE ,这样可以清楚地看出它们之间的区别。this. 仅在存在名称冲突时才应使用,但是除了 getter 和 setter 之外,在良好的代码中不应该存在名称冲突。 - MetroidFan2002
一个色盲程序员可以设置IDE显示标记以消除歧义。我认为@MetroidFan2002所说的是自动化这种事情。 - HRJ
显示剩余2条评论

10

我经常看到人们这样做是因为它会触发intellisense。个人而言,我更喜欢省略"this.",因为它会增加代码量,但没有任何实际价值。


3
但是即使没有它,您仍然可以触发 IntelliSense。在 Eclipse 和 IntelliJ 中,在空白链接上按 Control-Space 可触发 IntelliSense。这与从 this. 按 Control-Space 是相同的。 - Steve Kuo

7
同样的原因,为什么有些人喜欢在私有数据成员前加上 "m_" 或者给接口命名为 "IFoo"。他们认为这样可以增加可读性和清晰度。不管你是否同意这些约定,都是一种口味问题。

6
在.NET世界中,微软的StyleCop工具也有一个规则叫做“使用this前缀本地调用”:
当代码包含对本地类或基类实例成员的调用而未带上“this.”前缀时,就违反了这个规则。当存在基类成员的本地覆盖并且代码意图直接调用基类成员以绕过本地覆盖时,可以使用“base.”而不是“this.”前缀来调用,这种情况例外。
默认情况下,StyleCop不允许使用下划线或m_来标记本地类字段,而是倡导使用“this.”前缀。使用“this.”的好处是它适用于所有元素类型,包括方法、属性等,并不仅限于字段,使得对类成员的所有调用无论使用哪个编辑器查看代码都能立即识别。另一个好处是,它在实例成员和静态成员之间创建了快速、可识别的区分,静态成员不需要前缀。
使用“this.”前缀的最后一个好处是输入this.将导致Visual Studio显示IntelliSense弹出窗口,使开发人员能够快速轻松地选择要调用的类成员。
我的建议是选择一种约定(使用this.还是不使用)并坚持使用。

3

它可以帮助您一眼识别成员变量。但上面的ToString()方法太小了,无法说明这一点。
假设您有一个屏幕大小的方法。您要计算、分配、交换本地和实例变量。使用this.memberVarthis.PropertyName可以帮助您跟踪通过字段分配或属性设置修改实例状态的位置。


3
一个小提示,可能值得注意的是,在Eclipse中,“清理”工具可以根据设置自动添加/删除这个“.”到成员访问中。
在首选项对话框中选择“Java / Code Style / Clean Up”。

2

除了消除方法参数的歧义,它并没有什么用处。也许可以提高代码的清晰度和可读性,但这取决于你的编程风格。


2

他们可能是Python程序员,如果没有显式的this就会感到困扰/迷失/困惑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接