Another option that gets some of the benefit and doesn't require a
spec change is to omit the reference to the enclosing instance if it
is unused. We've been doing that successfully for a few years at
Google. There was some minor compatibility impact to code using
reflection to access the synthetic field that stores the reference to
the enclosing instance, but that was very rare, and the benefit is
that it avoids some memory leaks.
The people who would complain are in a pretty weak position:
- The field is private and synthetic; you shouldn't be reflecting on
it at all;
- The field name is an implementation detail of the compiler, and not
specified, so you shouldn't even pretend you know its name;
- If its your class, the easy thing to do is add an accessor, so the
only people who would complain are those that are breaking into classes
they don't control.
I think it is reasonable for the language to infer whether the enclosing
instance is "captured" by the inner class or not, and that's consistent
with how lambdas behave.