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

    你还有很多未完成的梦,你有什么理由停下脚步
  • 相关阅读:
    abp记录1
    javascript Date format(js日期格式化) 转载
    css 宽高等比
    MVC 自己创建URL 对象处理路径
    转载 Easyui Tree方法扩展
    Bootstrap 学习笔记1
    动态创建form 完成form 提交
    单例模式
    工厂模式(已体会到此模式的意义)
    设计模式实践
  • 原文地址:https://www.cnblogs.com/quanziheng/p/13559702.html
Copyright © 2011-2022 走看看