2013-03-29 4 views
10

Я видел, что ClassName.this используется во множестве Android-кода на SO и других местах в Интернете (а не простое ключевое слово this), чтобы обратиться к текущему экземпляру класса. Я понимаю, что вы можете решить префикс this с именем класса, чтобы устранить любую двусмысленность, но по моему опыту это часто не нужно, так как может быть только одна вещь. this ссылается на - текущий экземпляр класса, код которого Выполнение. Есть ли что-то еще, что я упускаю из виду, что предлагало бы предварять ключевое слово this с именем класса, всегда лучше, или есть ситуации, когда это действительно необходимо?Какова цель ClassName.this вне значения?

ответ

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, который является экземпляром MyActivity, который охватывает экземпляр Button.OnClickListener.

+0

Спасибо. Я полагал, что это может быть так, но я видел, что он использовался, прежде чем ссылаться на класс-класс из внутреннего или анонимного класса, поэтому я был вынужден запросить SO. – dcow

+0

+1 Ваши ответы всегда превосходны :) –

+1

@DavidCowden: Иногда вы увидите его из кода, который был во внутреннем классе, получил рефакторинг из внутреннего класса, но разработчик оставил классификатор имени класса там, поскольку он не вызвали ошибку компиляции, и они не решили удалить ее. Вероятно, есть некоторые разработчики, которым нравится использовать его только для ясности. – CommonsWare

0

У меня нет такого репо, чтобы оставить комментарий, поэтому записываем его как ответ.

Я думаю, что основная проблема вопроса состояла в том, чтобы проверить, существует ли какое-либо преимущество использования classname.this над ключевым словом this в сценариях, где разработчик уже знает, что внутреннего вызова класса не будет.

Конечно, в случае сценариев внутреннего класса вы должны использовать classname.this, чтобы вызвать его охватывающий класс. но может быть scenraio, что вы уже знаете, что этот конкретный код не будет вызываться внутри любого внутреннего класса. Поэтому, чтобы указать classname.this, вместо этого просто используйте «this».

+0

Хорошо, что я прочитал ответы, было то, что это была единственная причина. Поэтому, чтобы ответить на ваш комментарий, нет причин, кроме ссылки на затененные объекты. (Если вы не рассматриваете предпочтения стиля кода и т. Д.), – dcow

Смежные вопросы