Есть ли способ явно ссылаться на нестатический экземпляр внутреннего класса?

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

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 обе эти ссылки имеют цвет- кодируется так же). Помимо того, что это всегда относится к самому внутреннему экземпляру класса в области видимости, есть ли способ сделать это явным?


person Brendan Weinstein    schedule 19.02.2016    source источник


Ответы (1)


То, что вы описали, - это то, что вам нужно делать в соответствии со спецификациями языка Java. Невозможно изменить значение this в Java, и нет способа изменить квалификацию включающего класса, если это то, что вы пытаетесь сделать. Вы всегда можете создать свои собственные локальные переменные в качестве ярлыка, если это вам поможет.

person Doug Stevenson    schedule 19.02.2016