Вы можете явно ссылаться на экземпляр класса для класса верхнего уровня, как показано ниже:
public class Dog {
public void subscribeDogToTreats() {
Set<?> listenerSet = map.get("treats");
listenerSet.add(Dog.this);
map.put("treats", listenerSet);
}
}
Однако, если вы попытаетесь сослаться на это из анонимного внутреннего класса с намерением сделать это ссылкой на анонимный внутренний класс. Используя тот же шаблон именования, вы получите ошибку «не является включающим классом». Например:
public class Dog {
void initializeHunger() {
OnHungerChangeListener listener = new OnHungerChangeListener() {
public void onHungerChanged(int stomachCapacity) {
if(stomachCapacity == Stomach.FULL) {
stomach.removeOnHungerChangeListener(OnHungerChangeListener.this);
}
}
}
stomach.addOnHunderChangeListener(listener);
Реальный пример того, где я хотел бы это сделать, - это добавить OnPageChangeListeners в пейджеры и удалить их после завершения перехода в Android. Я знаю, что ключевое слово this ссылается на анонимный внутренний класс, но когда я сталкиваюсь с подобными ситуациями, я должен доказать это самому себе, распечатав имя класса. Я боюсь получить трудноуловимую ошибку, когда я ссылаюсь на экземпляр внешнего класса, где я имел в виду ссылку на внутренний, или наоборот.
Я бы предпочел всегда использовать Dog.this или InnerClass.this, чтобы быть явным, и мне интересно, есть ли способ сделать это для нестатических внутренних классов или как другие разработчики справляются с этим (в Android Studio обе эти ссылки имеют цвет- кодируется так же). Помимо того, что это всегда относится к самому внутреннему экземпляру класса в области видимости, есть ли способ сделать это явным?