匿名內部類的方法參數一定要設置final

在java中, 方法的內部類可以訪問方法中的局部變量,但必須用final修飾才能訪問。
比如下面這段代碼:
private Animator createAnimator(final View view,final int position){
    MyAnimator ani = new MyAnimator();
    ani.addListener(new AnimatorListener(){
        @Override
        priblic void onAnimationEnd(Animator arg0){
            Log.d(TAG,"position:"+position);
        }
    });
    return ani;
}
原因有以下兩個:

原因1:

當方法被調用運行完畢之後,局部變量就已消亡了。但內部類對象可能還存在,直到沒有被引用時纔會消亡。此時就會出現一種情況,就是內部類要訪問一個不存在的局部變量。
解決辦法:
使用final修飾局部變量,通過將final局部變量"複製"一份,複製品直接作爲方法內部類中的數據成員,這事方法內部類訪問的其實是這個局部變量的複製品!而且,由於被final修飾的變量賦值後不能再修改,所以就保證了複製品與原始變量的一致。

原因2:

Java採用了一種copy   local   variable(複製局部變量)的方式來實現,定義爲final的局部變量拷貝過來用,也就是說把定義爲final的局部變量拷貝過來用,而引用的也可以拿過來用,只是不能重新賦值。造成了可以access   local   variable(訪問局部變量)的假象,而這個時候由於不能重新賦值。

總結

使用final修飾符不僅會保持對象的引用不會改變,而且編譯器還會持續維護這個對象在回調方法中的生命週期。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章