有没有办法显式引用非静态内部类实例?

时间:2016-02-19 19:45:14

标签: java android anonymous-inner-class

您可以显式引用顶级类的类实例,如下所示:

public class Dog {
  public void subscribeDogToTreats() {
    Set<?> listenerSet = map.get("treats");
    listenerSet.add(Dog.this);
    map.put("treats", listenerSet);
  }
}

但是,如果您尝试在匿名内部类中引用它,则意图是对匿名内部类的引用。使用相同的命名模式,您将收到错误&#34;不是封闭类。&#34;例如:

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添加到viewpage并在Android中完成转换后删除它们。我知道关键字this引用了匿名内部类,但是当遇到这样的情况时,我必须通过打印出类名来证明这一点。我害怕有一个难以捕获的bug,我在引用外部类实例,我想引用内部,反之亦然。

我更愿意总是使用Dog.this或InnerClass.this是明确的,我想知道是否有办法为非静态内部类或其他开发人员如何处理这个(在Android Studio中,这两个引用颜色编码相同)。除了记住这总是引用范围内最内部的类实例之外,有没有办法使它明确?

1 个答案:

答案 0 :(得分:0)

您所描述的是根据Java语言规范必须执行的操作。没有办法改变Java中this的含义,也无法改变封闭类的资格,如果这是你正在尝试做的事情。您可以随时将自己的局部变量作为快捷方式,如果这对您有帮助的话。