在Java中,为什么人们用`this`前置字段?

Ste*_*Kuo 25 java coding-style

引用类变量时,为什么人们会在它前面添加this?我不是在谈论this用于消除方法参数歧义的情况,而是在看似不必要时.

例:

public class Person {        
    private String name;

    public String toString() {
        return this.name;
    }
}
Run Code Online (Sandbox Code Playgroud)

toString,为什么不直接引用namename

return name;
Run Code Online (Sandbox Code Playgroud)

什么this.name买什么?

这是一个stackoverflow问题,其代码已this预先挂起.

Dou*_*rie 56

  1. 防御性编程(如果有人编辑代码,以后会添加一个参数或带有冲突名称的本地
  2. 使代码"自我记录"更加明显


Dan*_*wak 37

有时需要消除歧义:

public void setFoo(Bar foo) {
    this.foo = foo;
}
Run Code Online (Sandbox Code Playgroud)

在其他时候,这只是一种风格.总的来说,我尽量避免this.blah使用,因为它更冗长.如果您想知道,结果字节码完全相同.


Jos*_*gle 11

它在语言层面没有任何作用.但它确实可以立即指示某人阅读有关变量范围的代码,从而提高对代码的理解.


jwa*_*gel 10

我经常看到人们这样做是因为它触发了智能感知.我个人更喜欢放弃"这个".因为它创造了更多没有任何价值的代码.

  • 但是没有它你仍然可以触发intellisense.Eclipse和IntelliJ中空白链接上的Control-Space触发intellisense.它与`this`中的Control-Space相同. (3认同)

duf*_*ymo 7

同样的原因,有些人喜欢用"m_"或名称接口"IFoo"来预置私有数据成员.他们相信它提高了可读性和清晰度.您是否同意这些惯例是一个品味问题.


hus*_*int 6

在.NET世界中,Microsoft StyleCop工具还有一个名为"Prefix Local Calls With This"的规则:

只要代码包含对本地类的实例成员的调用或没有以"this"为前缀的基类,就会违反此规则.当存在基类成员的本地覆盖时,会发生此规则的例外,并且代码打算直接调用基类成员,绕过本地覆盖.在这种情况下,调用可以以"base"为前缀.而不是'这个'.

默认情况下,StyleCop不允许使用下划线或m_来标记本地类字段,而是支持'this'.字首.使用'this'的好处.它同样适用于所有元素类型,包括方法,属性等,而不仅仅是字段,使得对类成员的所有调用都可以立即识别,无论使用哪个编辑器来查看代码.另一个优点是它在实例成员和静态成员之间创建了一个快速,可识别的区别,它们不是前缀.

使用'this'的最后一个好处.输入前缀就是这个.将导致Visual Studio显示IntelliSense弹出窗口,使开发人员可以快速轻松地选择要调用的类成员.

我的建议是选择一个约定(使用或不使用)并坚持使用.