java有办法显式引用非静态内部类实例吗?
可以显式引用顶级类的类实例,如下所示:
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添加到viewpagers,并在Android中完成转换后将其删除。我知道关键字this引用了匿名内部类,但是当我遇到这样的情况时,我必须通过打印类名来证明这一点。我害怕有一个难以捕捉的bug,我引用的是外部类实例,我想引用的是内部类实例,反之亦然
我更喜欢用狗。这个或内部类。这是显式的,我想知道是否有一种方法可以为非静态内部类实现这一点,或者其他开发人员如何处理这一点(在Android Studio中,这两个引用的颜色编码相同)。除了记住这总是指作用域中最内部的类实例之外,还有什么方法可以使其显式化吗
# 1 楼答案
您描述的是根据Java语言规范必须做的事情。在Java中,没有办法改变
this
的含义,也没有办法改变封闭类的限定条件,如果您正试图这样做的话。如果这对你有帮助的话,你可以随时制作自己的局部变量作为快捷方式