2011-01-09 63 views
9

我一直想知道的东西;在一个可以通过使用'this。[NAME]'或简单地[NAME]引用成员的类中,这是首选?在OOP中,关于在课堂上使用“this”的最佳做法是什么?

例如在Java中:

public class foo { 
    public int bars = 0; 
    private void incrementBars(){ 
     bars++; 
    } 
} 

public class foo { 
    public int bars = 0; 
    private void incrementBars(){ 
     this.bars++; 
    } 
} 

'似乎' 有同样的效果。

在我实例化类Foo的多个实例的情况下,我想,到目前为止,这样做:

for (foo f : listOfFoos){ 
    f.incrementBars(); 
} 

,它似乎仍然可以工作。

它在技术上是不明确的,如果是的话是否有一个首选方法?

+7

注意,这两种方法不只是* *似乎有同样的效果 - 他们实际上做。访问实例成员时隐含`this.`,并且编译的字节码对于任何语法都是相同的。 “ – cdhowie 2011-01-09 19:24:09

+0

”“这个。被暗示“......和编译字节码将是要么语法相同” - Oooooooh :) – Danedo 2011-01-09 19:53:50

回答

15

variable shadowing的情况下使用this

class MyClass{ 
     int i;//1 
     public void myMethod(){ 
      i = 10;//referring to 1  
     } 

     public void myMethod(int i){//2 
      i = 10;//referring to 2 
      this.i = 10 //refering to 1  
     }  
    } 

也有时this将使得代码更易读,由于我们的英语思维

+4

我个人认为`this.` *总是*更具可读性。它引入了一致性。无论上下文如何,您都可以确定该变量是该对象的成员。 – 2011-01-09 19:27:13

3

您使用this确保并传达你正在处理一个

它可以让你写一个setter像

public void setX(int x) { 
    this.x = x; 
} 

这是非常succint。

2

您需要的唯一时间this.是当前范围也有一个相同名称的变量。对于所有类变量,我倾向于使用_variable的惯例。这样,我永远不必使用this.,并且永远不会碰到一个类变量,认为它是一个本地作用域变量。

5

没有歧义。如果有,你会使用this

为了清楚起见,有人建议使用this。当不需要时,其他人会推荐它,因为它引入了“噪音”。为了清楚起见,一些现代的IDE或编辑器可能能够使用语法高亮显示来区别字段的颜色(例如)。

我个人可以避免this当我可以和使用@unholysampler's underscore convention。与同事商定一些事情,并将其写入您的编码标准。

0
class Test 
{ 
    private int value; 

    public Test(int value) 
    { 
    // This is wrong 
    // value = value 

    // This is right 
    this.value = value; 
    } 
} 

使用“this”来访问被局部变量隐藏的成员变量。 因为“这”仅仅是对当前对象的引用,您可以同时做到这一点:

doSomething(this); 

这些基本上你永远都需要使用这个唯一的途径。

0

这是除了在您拥有可变阴影(其中Jigar在他的回答中指出)的情况​​下,技术上含糊。

大多数情况下,如果您使用的编辑器/ IDE非常了解您的类结构,那么语法突出显示将使变量在对象中是字段还是方法中定义的变量很明显。但是,在更纯粹的文本编辑器(例如vim)中,语法高亮没有说明这一点。

虽这么说,我更喜欢使用this.field指的是,在对象属于如果仅仅是因为我知道,所有的领域我正常的IDE之外的每一个现在,然后我会阅读代码。它稍微更冗长,但这是一个我不介意的折衷。

0

在你的问题的前两个样本有完全一样的东西。

public class Test { 
    private int a; 

    public void noShadow() { 
     System.out.println(a); // attribute 
    } 

    public void shadow(int a) { 
     System.out.println(a); // parameter 
     System.out.println(this.a); // attribute 
    } 
} 

现在我不认为这是一个绝对的最佳实践,特别是在现代的IDE提供先进的语法高亮:唯一的地方this是强制性的,当一个属性是由一个局部变量阴影是。有些人喜欢用前缀的东西像属性_m_等,不使用this。有些人宁愿强制使用this,也不要在属性上添加任何命名规则。你将要做的很大程度上取决于现有的代码或现有的编码标准。我没有任何东西确保编码标准对于所有从事这个项目的人都是一样的。

相关问题