lambda bugs? referencing instance variable from lambda body
Zhong Yu
zhong.j.yu at gmail.com
Thu Sep 12 16:07:41 PDT 2013
These problem can be worked around by prefixing "this.", which is
probably a good practice anyway in such usage scenarios.
However, please confirm that even without "this.", lambda always
captures only "this", it never captures the instance variables' values
at the time of lambda creation.
Zhong Yu
On Thu, Sep 12, 2013 at 5:59 PM, Zhong Yu <zhong.j.yu at gmail.com> wrote:
> This compiles . . . . . . . . . . . . . . . . . . . . . . . . .
>
> public class Tmp
> {
> final Runnable r1 = ()->System.out.println(r1);
> }
>
> This does NOT . . . . . . . . . . . . . . . . . . . . . . . . .
>
> public class Tmp
> {
> final Runnable r1;
>
> final Runnable r2 = ()-> System.out.println(r1); // Error: r1 not
> initialized
>
> Tmp()
> {
> r1 = ()->System.out.println(r1); // Error: r1 not initialized
> }
> }
>
>
>
> This compiles . . . . . . . . . . . . . . . . . . . . . . . . .
>
> public class Tmp
> {
> final Object lock = new Object();
>
> final Runnable r2 = ()->{
> System.out.println(r2);
> synchronized (lock){
> }
> };
> }
>
> This does NOT . . . . . . . . . . . . . . . . . . . . . . . . .
>
> public class Tmp
> {
> final Object lock = new Object();
>
> final Runnable r2 = ()->{
> synchronized (lock){
> System.out.println(r2); // Error: self-reference in initializer
> }
> };
> }
>
>
> Zhong Yu
More information about the lambda-dev
mailing list