2011-01-09 64 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,也不要在屬性上添加任何命名規則。你將要做的很大程度上取決於現有的代碼或現有的編碼標準。我沒有任何東西確保編碼標準對於所有從事這個項目的人都是一樣的。

相關問題