为什么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就是用此法。
你还有很多未完成的梦,你有什么理由停下脚步