1. 程式人生 > >java遺珠之effectively final.md

java遺珠之effectively final.md

在早期的版本中,本地類,匿名類訪問本地變數都需要是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