zoukankan      html  css  js  c++  java
  • 为什么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就是用此法。

    你还有很多未完成的梦,你有什么理由停下脚步
  • 相关阅读:
    半截水晶头线接激活本地虚拟网卡
    快捷键
    嵌入式系统原理与应用技术(第三版)-读书笔记
    嵌入式基本常识(一)
    PWM输出
    ARM-GPIO
    POI使用
    oracle常见命令
    JS获取contextPath的方法
    JPA自动生成表
  • 原文地址:https://www.cnblogs.com/quanziheng/p/13559702.html
Copyright © 2011-2022 走看看