Какова цель ClassName.this вне значения?

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

Ответ 1

Чтобы получить доступ к экземпляру входящего класса из внутренних классов или анонимных классов, вам необходимо использовать этот синтаксис:

EnclosingClass.this.someMethod();

Ответ 2

действительно может быть только одна вещь, на которую это ссылается.

Это неверно.

Есть ли что-то еще, что я упускаю из виду, что предлагало бы предварять это ключевое слово с именем класса, всегда лучше, или есть ситуации, в которых это необходимо?

Да и да, соответственно. В частности, из внутренних классов требуется 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.

Ответ 3

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

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

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