Я видел, что ClassName.this
используется во множестве Android-кода на SO и других местах в Интернете (а не простое ключевое слово this
), чтобы обратиться к текущему экземпляру класса. Я понимаю, что вы можете решить префикс this
с именем класса, чтобы устранить любую двусмысленность, но по моему опыту это часто не нужно, так как может быть только одна вещь. this
ссылается на - текущий экземпляр класса, код которого Выполнение. Есть ли что-то еще, что я упускаю из виду, что предлагало бы предварять ключевое слово this
с именем класса, всегда лучше, или есть ситуации, когда это действительно необходимо?Какова цель ClassName.this вне значения?
ответ
Чтобы получить доступ к экземпляру вмещающего класса внутри внутренних классов или анонимных классов, вам нужно использовать следующий синтаксис:
EnclosingClass.this.someMethod();
действительно может быть только одна вещь это касается.
Это неверно.
Есть ли что-то еще, что я упускаю из виду, что предлагало бы предварять это ключевое слово с именем класса, всегда лучше, или есть ситуации, где это необходимо?
Да и да, соответственно. В частности, из внутренних классов требуется 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
.
Спасибо. Я полагал, что это может быть так, но я видел, что он использовался, прежде чем ссылаться на класс-класс из внутреннего или анонимного класса, поэтому я был вынужден запросить SO. – dcow
+1 Ваши ответы всегда превосходны :) –
@DavidCowden: Иногда вы увидите его из кода, который был во внутреннем классе, получил рефакторинг из внутреннего класса, но разработчик оставил классификатор имени класса там, поскольку он не вызвали ошибку компиляции, и они не решили удалить ее. Вероятно, есть некоторые разработчики, которым нравится использовать его только для ясности. – CommonsWare
У меня нет такого репо, чтобы оставить комментарий, поэтому записываем его как ответ.
Я думаю, что основная проблема вопроса состояла в том, чтобы проверить, существует ли какое-либо преимущество использования classname.this над ключевым словом this в сценариях, где разработчик уже знает, что внутреннего вызова класса не будет.
Конечно, в случае сценариев внутреннего класса вы должны использовать classname.this, чтобы вызвать его охватывающий класс. но может быть scenraio, что вы уже знаете, что этот конкретный код не будет вызываться внутри любого внутреннего класса. Поэтому, чтобы указать classname.this, вместо этого просто используйте «this».
Хорошо, что я прочитал ответы, было то, что это была единственная причина. Поэтому, чтобы ответить на ваш комментарий, нет причин, кроме ссылки на затененные объекты. (Если вы не рассматриваете предпочтения стиля кода и т. Д.), – dcow
- 1. Какова цель {} вне любых методов?
- 2. Какова цель этого возвращаемого значения?
- 3. Какова цель анонимных типов?
- 4. Какова основная цель WebExceptionStatus.Success?
- 5. Какова цель "?"
- 6. Какова цель первого возвращаемого значения вызова цепочки?
- 7. Какова цель передачи значения ссылкой на функцию?
- 8. Какова цель «правильного» значения во вложенном дереве?
- 9. Какова цель атрибута значения тега ввода html?
- 10. Какова цель кэширования последнего значения в сети?
- 11. Workflow Foundation - какова цель «значения» для ResumeBookmark
- 12. Какова цель null?
- 13. Какова цель OCZLL Lazy.lazy_from_val?
- 14. Какова цель clojure.core.reducers/уменьшить?
- 15. Какова цель std :: rank?
- 16. Какова цель $ _POST?
- 17. Какова цель IApplicationBuilder.New()
- 18. Какова цель метода IntStream.empty()?
- 19. Какова цель IAsyncStateMachine.SetStateMachine?
- 20. Какова цель пакета
- 21. Какова цель заявления `pass`?
- 22. Какова цель "@SuppressWarnings (" unchecked ")"?
- 23. Какова цель этого javascript?
- 24. Какова цель константы PHP_DEBUG?
- 25. Какова цель configSections?
- 26. Какова цель сортированных наборов?
- 27. Какова цель python setuptools?
- 28. Какова цель «pm2 save»?
- 29. Какова цель метода _createElement?
- 30. Какова цель character_set_connection?
Можете ли вы это сделать, опуская 'EnclosingClass.this' и просто вызывая' someMethod() '? – dcow
Нет, если 'someMethod()' существует и во внутреннем классе. –
@EtienneMiret +1 согласился. –