Lambda expressions keeping a reference to the enclosing instance

Zhong Yu zhong.j.yu at
Wed Nov 20 07:58:01 PST 2013

I'm not sure they check the comment list. You can probably send it
directly to Dan Smith.

On Wed, Nov 20, 2013 at 4:09 AM, Markus Keller <markus_keller at> wrote:
> Resending; looks like my mail from 2013-11-08 to lambda-spec-comments was
> lost.
> __________________
> Dan Smith wrote on 2013-10-30 20:36:45:
> 15.27.4 defines the value of a lambda expression, but misses to define an
> important property of the lambda instance: Can/must/will the lambda
> instance contain a reference to the enclosing instance (if one exists)?
> 15.27.4 point 4 implicitly makes such a reference to the outer "this"
> necessary iff the lambda body actually contains such a reference. But it
> is unclear whether the lambda always contains this reference.
> For the similar situation with inner classes, JLS7 clearly specifies that
> the inner class constructor always gets a reference to the enclosing
> instance (8.1.3, 13.1, 15.9.3). For methods references, the new 15.28.3
> also spells out the forms for which a target reference is retained.
> For lambda expressions, current Java 8 beta implementations seem to avoid
> the reference by declaring the synthetic lambda$x method declaration as
> static if possible.
> Request: Specify that a reference to the enclosing instance of a lambda
> expression is only retained if necessary. That makes the system behavior
> well-defined and makes memory leaks (via lambda expressions that leak a
> reference to the enclosing instance) deterministic like in the rest of the
> Java language.
> Markus
> --
> References:
> jsr335-0.7.0 15.27.4 Point 4: "The method's body has the effect of
> evaluating the lambda body, if it is an expression, or of executing the
> lambda body, if it is a block;"
> JLS7 8.1.3 says about inner classes:
> "An instance i of a direct inner class C of a class O is associated with
> an instance of O, known as the immediately enclosing instance of i. The
> immediately enclosing instance of an object, if any, is determined when
> the object is created (§15.9.2)."
> JLS7 13.1 says about inner member classes:
> "In addition, the constructor of a non-private inner member class must be
> compiled such that it has as its first parameter, an additional implicit
> parameter representing the immediately enclosing instance (§8.1.3)."
> JLS7 15.9.3 says about anonymous classes:
> "Otherwise, the immediately enclosing instance of i with respect to S is
> the first argument to the constructor".

More information about the lambda-spec-observers mailing list