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就是用此法。

    你还有很多未完成的梦,你有什么理由停下脚步
  • 相关阅读:
    MySQL案例:一次单核CPU占用过高问题的处理
    编写你的第一个Django应用
    ks.cfg文件相关
    Kickstart部署多系统
    Kickstart部署之FTP架构
    Kickstart部署之HTTP架构
    Kickstart部署之NFS架构
    Kickstart无人值守原理及简介
    Linux下面Oracle实列实如何登录的
    welogic的受管理服务器无法启动
  • 原文地址:https://www.cnblogs.com/quanziheng/p/13559702.html
Copyright © 2011-2022 走看看