1. 程式人生 > 實用技巧 >為什麼Java匿名內部類訪問方法引數或者方法區域性變數需要用final來修飾

為什麼Java匿名內部類訪問方法引數或者方法區域性變數需要用final來修飾

下面是摘自於https://www.cnblogs.com/z-sm/p/7058864.html

在外部類的方法內定義類(只能是匿名內部類),則該內部類的例項的生命週期有可能超過區域性變數的生命週期(此場景即所謂的閉包,在javascript等很多語言中都有)。典型的是回撥函式的場景。

private Animator createAnimatorView(final View view, final int position) {
    MyAnimator animator = new MyAnimator();
    animator.addListener(new AnimatorListener() {
        @Override
        
public void onAnimationEnd(Animator arg0) { Log.d(TAG, "position=" + position); } }); return animator; }//onAnimationEnd事件可能在createAnimatorView方法結束後很久才觸發,觸發時用到了方法中的區域性變數position

方法執行完後區域性變數銷燬了,但內部類可能仍要訪問該區域性變數,這時就會出錯,怎麼辦?

Java解決方法是將區域性變數複製一份到內部類,這樣方法執行完後匿名內部類裡仍可使用該變數。但這種實現方式還需要確保在程式設計師看來他們是同一個,即值始終一樣,怎麼做到?

法1:同步。當匿名內部類內對複製值做修改時同步回區域性變數、在方法內的匿名內部類之後修改區域性變數時複製值也跟著改,這種實現上困難且麻煩。

法2:不用同步,直接將區域性變數宣告為final的以使其不可變。Java就是用此法。