![](/img/trans.png)
[英]java: local variable looper is accessed from within inner class; needs to be declared final, but then variable might not have been initialized
[英]Final Local Variable may not have been initialized in anonymous inner class
这是我的代码:
final Foo myFoo = new Foo(new Inner() {
@Override
callback(){
myFoo.bar();
}
});
(带实际功能名称)
final MyArrayAdapter aa = new MyArrayAdapter(new View.OnClickListener() {
@Override
onClick(){
aa.notifyDataSetChanged();
}
});
Java给我一个关于如何初始化myFoo的错误。 有没有什么办法解决这一问题? 我可以在构造对象时将回调设置为null,然后在之后进行更改,但我希望有更清洁的方法。 有任何想法吗? (如果Foo不是由我编写的,并且没有公开接口以便稍后更改回调,那么这也行不通)
如果有人好奇,在我的特定场景中,Foo是一个ArrayAdapter,条形图是notifyDataSetChanged()。 适配器显示的内容取决于数组中项目的值,并且这些值在单击时会更改。 回调是clickListener。
简短的回答是你绝对不能用Java做到这一点,但编译器已经告诉过你了。 你试图一次创建两个对象并引用彼此,这是鸡和蛋的问题。 最重要的是,你必须先创建其中一个。
建议是两步创建:
....
final MyArrayAdapter aa = new MyArrayAdapter();
aa.initializeButtonClickListener();
....
然后将“initialize”方法添加到适配器。
public void initializeButtonClickListener(){
this.button.setOnClickListener(new View.OnClickListener() {
@Override
onClick(){
notifyDataSetChanged();
}
});
}
因为这种构造有点复杂(即,比简单地调用构造函数更复杂),我建议然后将这两行拉入MyArrayAdapter
工厂方法,并使构造函数MyArrayAdapter
私有。
这将一般工作,无需访问Inner
定义,但您需要创建一个帮助程序类:
class CallbackHelper {
private Foo foo;
public void setFoo( Foo f ){ foo = f; }
public Foo getFoo(){ return foo; }
}
然后像这样使用它:
final CallbackHelper cbh = new CallbackHelper();
Foo myFoo = new Foo(new Inner() {
@Override
callback(){
cbh.getFoo().bar();
}
});
cbh.setFoo( myFoo );
你可以在包含的类中声明一个方法callBarOnMyFoo
,并从你的回调中调用它:
void callBarOnMyFoo() {
myFoo.bar();
}
然后你的回调需要调用callBarOnMyFoo
,它是外部类的实例方法, Inner
代码应该引用它(我忘记了它的语法)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.