这是我的代码:
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 不是我写的并且没有公开接口(interface)来稍后更改回调,那也是行不通的)
如果有人好奇,在我的具体场景中,Foo 是一个 ArrayAdapter,bar 是 notifyDataSetChanged()。适配器显示的内容取决于数组中项目的值,这些值在单击时会发生变化。回调是 clickListener。
最佳答案
简短的回答是,您在 Java 中肯定不能这样做,但编译器已经告诉您了。您试图同时创建两个相互引用的对象,这是先有鸡还是先有蛋的问题。底线是,您必须先创建其中一个。
一个建议是一个两步创建:
....
final MyArrayAdapter aa = new MyArrayAdapter();
aa.initializeButtonClickListener();
....
然后将“初始化”方法添加到适配器。
public void initializeButtonClickListener(){
this.button.setOnClickListener(new View.OnClickListener() {
@Override
onClick(){
notifyDataSetChanged();
}
});
}
因为构造有些复杂(即,比简单地调用构造函数更复杂),我建议将这两行拉入 MyArrayAdapter
工厂方法,并将构造函数设为私有(private)。
关于java - 最终局部变量可能尚未在匿名内部类中初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10239046/