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

时间:2009-01-02 04:58:15

标签: java coding-style

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

示例:

public class Person {        
    private String name;

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

toString中,为什么不将name引用为name

return name;

this.name买什么?

Here's一个stackoverflow问题,其代码有this预先挂起。

16 个答案:

答案 0 :(得分:56)

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

答案 1 :(得分:37)

有时需要消除歧义:

public void setFoo(Bar foo) {
    this.foo = foo;
}

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

答案 2 :(得分:11)

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

答案 3 :(得分:10)

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

答案 4 :(得分:6)

在.NET世界中,Microsoft StyleCop工具还有一个名为“使用此前缀本地调用”的规则:

  

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

     

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

     

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

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

答案 5 :(得分:6)

为什么有些人喜欢使用“m_”或名称接口“IFoo”来添加私有数据成员。他们相信它提高了可读性和清晰度。您是否同意这些惯例是一个品味问题。

答案 6 :(得分:3)

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

答案 7 :(得分:3)

稍微一点,但值得注意的是Eclipse中的“Clean Up”工具可以设置为自动添加/删除它。成员访问根据喜好。

首选项对话框中的“Java /代码样式/清理”。

答案 8 :(得分:2)

除了使用方法参数消除歧义之外,它什么都不买。也许清晰度/可读性,但这取决于你的风格。

答案 9 :(得分:2)

我认为如果你在属性名称之前加入这个没有错。如果您声明具有相同名称(在初始化属性时可能在构造函数中发生),这有助于消除属性与局部变量的歧义。

它不会影响性能,它不会产生任何可读性问题(如果它可以使阅读更容易)。

所以我认为我们不必担心这一点。让程序员自己做出选择。

答案 10 :(得分:2)

我使用它的唯一地方是类中的构造函数,其中类的一些/大多数字段可以由构造函数提供。我使用它而不是使用短名称作为方法签名,它似乎比缩写更加一致。

例如在“Rational”类中

而不是做

class Rational
{
    int denominator;
    int numerator;

    public Rational(int d, int n)
    {
        denominator = d;
        numerator = n;
    }
}

我这样做。

class Rational
{
    int denominator;
    int numerator;

    public Rational(int denominator, int numerator)
    {
        this.denominator = denominator;
        this.numerator = numerator;
    }
}

通过这种方式,调用者可以更多地了解构造函数参数的用途。

答案 11 :(得分:1)

他们可能是一名Python程序员,如果没有明确的话,就会遭受折磨/迷失/混淆。

答案 12 :(得分:0)

要记住的其他事情是语言本身。你没有特别提到Java(虽然我假设你并没有真正考虑其他因素,所以这个评论更加明确),但正如之前的海报已经提到的那样,这是一个很好的方法来使代码自我当其他人开始修改您的代码库时,记录以防止混淆。

但是,如果您使用PHP,则在引用类变量时,$this的使用通常是必需的。由于语言之间存在不同的规则,因此通常最容易使用它们之间常见的模式,这种模式恰好是一种非常可靠的编码风格。我更容易将this简单地添加到所有内容中,而不是试图记住语言需要什么,以及什么语言只是“更喜欢”它。

答案 13 :(得分:0)

“this”可防止与父类/ es中具有相同名称的实例变量混淆。

这几乎是“超级”前缀的补充。

答案 14 :(得分:0)

我在编写大量代码时尝试使用'this.whatever',因为更容易弄清楚引用的是什么。当阅读其他人编写的大块代码时,在某些时候我常常会对它们是引用实例变量还是局部变量感到困惑。

答案 15 :(得分:0)

代码更简单。 在我看来,另一个好的做法是调用getXXX()中的toString()(而不是this.XXX),因为getXXX()可以有一个重要的逻辑。

我认为在没有这个的情况下使用属性名称对于维护应用程序来说不是一个好主意。