2013-03-29 37 views
10

我見過ClassName.this用於SO和其他地方在線的很多Android代碼(而不是簡單的this關鍵字)來引用類的當前實例。我知道你可能會決定用類名前加this以消除任何不明確的地方,但以我的經驗來看,這樣做往往是不必要的,因爲this指的只是一件事 - 代碼的類的當前實例執行英寸是否還有別的我可以忽略的暗示關鍵字this預設類名永遠是更好的做法,或者是否有任何情況下它實際上是必要的?ClassName的用途是什麼?這超出了消歧?

回答

20

要從內部類或匿名內部類訪問封閉類的實例,你需要使用這個語法:

EnclosingClass.this.someMethod(); 
+0

你可以通過省略'EnclosingClass.this'並簡單地調用'someMethod()'來做到嗎? – dcow

+5

如果'someMethod()'也存在於內部類中,則不是。 –

+0

@EtienneMiret +1同意。 –

9

那裏確實只有一件事是指的。

這是不正確的。

是否還有別的我可以忽略,建議在類名稱前加上這個關鍵字總是更好的做法,或者是否有任何需要的情況?

分別是和是。特別是,內部類需要ClassName.this才能到達外部類實例this

例如:

myButton.setOnClickListener(new Button.OnClickListener() { 
    public void onClick(View v) { 
      startActivity(new Intent(MyActivity.this, MyOtherActivity.class)); 
     } 
    }); 

在這裏,用的this代替MyActivity.this將失敗,編譯錯誤,抱怨Button.OnClickListener不給Intent構造一個有效的第一個參數。 MyActivity.this返回this即包含Button.OnClickListener實例的MyActivity實例。

+0

謝謝。我想這可能是這種情況,但我已經看到它使用超越內部或匿名類的封閉類,所以我覺得不得不查詢SO。 – dcow

+0

+1你的回答永遠是優秀的:) –

+1

@DavidCowden:有時你會從內部類的代碼中看到它,被重構出內部類,但是開發人員在那裏留下了類名限定符,因爲它沒有提出編譯錯誤,他們也沒有選擇刪除它。可能有些開發人員爲了清晰起見而喜歡使用它。 – CommonsWare

0

我沒有那麼多的回購來發表評論,所以寫下來作爲答案。

我認爲問題的根本關切是檢查是否存在使用classname.this了在開發者已經知道不會有任何內部類的呼叫場景「這個」關鍵字的任何優勢。

當然,在內部類方案的情況下,您必須使用classname.this來調用它的封閉類。但可以有情景,你已經知道這個特定的代碼不會在任何內部類中調用。所以爲什麼要指定classname.this,而不是使用'this'。

+0

那麼我閱讀答案的方式就是這是唯一的原因,所以要回答你的評論,除了引用陰影對象之外沒有其他理由(除非你正在考慮代碼風格偏好等) – dcow