簡體   English   中英

最終本地變量可能尚未在匿名內部類中初始化

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM