[英]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.