java遗珠之effectively final

Posted 吴冬冬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java遗珠之effectively final相关的知识,希望对你有一定的参考价值。

在早期的版本中,本地类,匿名类访问本地变量都需要是final的。

但是1.8版本中,本地类和匿名类,还有lambda表达式访问本地变量已经不用声明为final了,仅仅是不用明确写为final,其实还是final的,这种不明确性可以称之为effectively final,也就是你声明的是一个非final的变量,但是你只要不改变它就可以了。

  void methodInFirstLevel(int x) 

            // The following statement causes the compiler to generate
            // the error "local variables referenced from a lambda expression
            // must be final or effectively final" in statement A:
            //
            // x = 99;

            Consumer<Integer> myConsumer = (y) ->
            
                System.out.println("x = " + x); // Statement A
                System.out.println("y = " + y);
                System.out.println("this.x = " + this.x);
                System.out.println("LambdaScopeTest.this.x = " +
                        LambdaScopeTest.this.x);
            ;


            myConsumer.accept(x);

        

一旦放开x=99的注释就会报错。

local variables referenced from a lambda expression must be final or effectively final

以上是关于java遗珠之effectively final的主要内容,如果未能解决你的问题,请参考以下文章

java遗珠之多异常

java遗珠之重复注解

java遗珠之前言

java遗珠之@SafeVarargs

java遗珠之协变返回类型

java遗珠之异常种类