<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
</head>
<body>
<div class="markdown-here-wrapper">
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">What
Chen said.</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">In
principle, in this case, creation could be allowed because the
local doesn’t capture. But when discussing the rules, we reached
the conclusion that we didn’t want to specify what “capture”
meant - or classify local classes in terms of what they happen
to be capturing. So, if that is what you were asking, I’d say
the behavior you are observing is deliberate.</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">Dan
correctly pointed out, during an off-line discussion, that what
it would be useful, in some cases, would be the ability to
declare a local <em>static</em> class. In which case you are
stating that capture of variables in the enclosing context by
the class is just not a possibility. In that case, the rules can
be relaxed, but on a much more principed basis.</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">Maurizio</p>
<p style="margin-block: 0px 19.2px; margin-bottom: 19.2px; margin-top: 0px;">On
10/12/2024 22:47, Chen Liang wrote:</p>
<blockquote type="cite" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(114, 159, 207) rgb(119, 119, 119); border-inline-start: 2px solid rgb(114, 159, 207); border-left: 2px solid rgb(114, 159, 207); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); caret-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); margin-block: 8px; margin-bottom: 8px; margin-inline: 0px; margin-left: 0px; margin-right: 0px; margin-top: 8px; outline-color: rgb(119, 119, 119); padding-block: 3.2px; padding-bottom: 3.2px; padding-inline: 8px; padding-left: 8px; padding-right: 8px; padding-top: 3.2px; quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
<div class="external-content" id="extcontent-0" style="border-block-color: rgb(119, 119, 119); border-bottom-color: rgb(119, 119, 119); border-inline-color: rgb(119, 119, 119); border-left-color: rgb(119, 119, 119); border-right-color: rgb(119, 119, 119); border-top-color: rgb(119, 119, 119); caret-color: rgb(119, 119, 119); color: rgb(119, 119, 119); column-rule-color: rgb(119, 119, 119); outline-color: rgb(119, 119, 119); quotes: none; text-decoration-color: rgb(119, 119, 119); text-emphasis-color: rgb(119, 119, 119);">
<p dir="ltr">Hi Archie,<br>
I think this rule makes sense - Local1 can capture local
variables in the outer class initializer, in which case the
error will be legitimate. The extra otherwise does not fix
this issue. Adding a special case to allow no-capture local
classes to be used in more nested static contexts seems
overkill and error-prone.</p>
<p dir="ltr">Chen</p>
<br>
<div class="gmail_quote">
<div class="gmail_attr" dir="ltr">On Tue, Dec 10, 2024,
3:57 PM Archie Cobbs <<a href="mailto:archie.cobbs@gmail.com" class="moz-txt-link-freetext">archie.cobbs@gmail.com</a>>
wrote:<br>
</div>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex" class="gmail_quote">
<div dir="ltr">
<div dir="ltr">
<div>
<div>The proposed JLS changes for JEP 492 are saying
that this example should no longer compile*:<br>
</div>
</div>
<div><br>
</div>
<div> static {<br>
class Local1 {<br>
class Local2 {<br>
public static void m() {<br>
new Local1(); // error<br>
}<br>
}<br>
}<br>
}</div>
<div><br>
</div>
<div>but that seems wrong - that exampple has been
allowed since JDK-8254321, and as it has nothing to
do with flexible constructors, it should continue to
be allowed.<br>
</div>
</div>
<div dir="ltr"><br>
</div>
<div>The JEP 492 spec says (new additions in bold):</div>
<div>
<p> If <em>C</em> is an inner local class, then:</p>
<ul>
<li>
<p>If <em>C</em> occurs in a static context, then
<em>i</em> has no
immediately enclosing instance. <strong>Let <em>S</em>
be the nearest
<code>static</code> method declaration, <code>static</code>
field
declaration, or static initializer that
encloses the declaration of
<em>C</em>. If the nearest <code>static</code>
method declaration,
<code>static</code> field declaration, or
static initializer that
encloses the class instance creation
expression is not <em>S</em>, then
a compile-time error occurs.</strong></p>
</li>
</ul>
</div>
<div>Should there be an <b>Otherwise</b> at the
beginning of the newly added sentence? (And same thing
in the previous paragraph regarding anonymous classes)<br>
</div>
<div><br>
</div>
<div>-Archie<br>
</div>
<div dir="ltr"><br>
</div>
<div dir="ltr">* See <a rel="noreferrer" href="https://bugs.openjdk.org/browse/JDK-8345953">JDK-8345953</a>
JEP 492: instantiating local classes in a different
static context should not be allowed</div>
<div dir="ltr"><span class="gmail_signature_prefix"><br>
</span></div>
<div dir="ltr"><span class="gmail_signature_prefix">-- </span><br>
<div data-smartmail="gmail_signature" class="gmail_signature" dir="ltr">Archie L. Cobbs<br>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
<div title="MDH:PHA+V2hhdCBDaGVuIHNhaWQuPC9wPjxwPkluIHByaW5jaXBsZSwgaW4gdGhpcyBjYXNlLCBjcmVhdGlvbiBjb3VsZCBiZSBhbGxvd2VkIGJlY2F1c2UgdGhlIGxvY2FsIGRvZXNuJ3QgY2FwdHVyZS4gQnV0IHdoZW4gZGlzY3Vzc2luZyB0aGUgcnVsZXMsIHdlIHJlYWNoZWQgdGhlIGNvbmNsdXNpb24gdGhhdCB3ZSBkaWRuJ3Qgd2FudCB0byBzcGVjaWZ5IHdoYXQgImNhcHR1cmUiIG1lYW50IC0gb3IgY2xhc3NpZnkgbG9jYWwgY2xhc3NlcyBpbiB0ZXJtcyBvZiB3aGF0IHRoZXkgaGFwcGVuIHRvIGJlIGNhcHR1cmluZy4gU28sIGlmIHRoYXQgaXMgd2hhdCB5b3Ugd2VyZSBhc2tpbmcsIEknZCBzYXkgdGhlIGJlaGF2aW9yIHlvdSBhcmUgb2JzZXJ2aW5nIGlzIGRlbGliZXJhdGUuPC9wPjxwPkRhbiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQsIGR1cmluZyBhbiBvZmYtbGluZSBkaXNjdXNzaW9uLCB0aGF0IHdoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBpbiBzb21lIGNhc2VzLCB3b3VsZCBiZSB0aGUgYWJpbGl0eSB0byBkZWNsYXJlIGEgbG9jYWwgX3N0YXRpY18gY2xhc3MuIEluIHdoaWNoIGNhc2UgeW91IGFyZSBzdGF0aW5nIHRoYXQgY2FwdHVyZSBvZiB2YXJpYWJsZXMgaW4gdGhlIGVuY2xvc2luZyBjb250ZXh0IGJ5IHRoZSBjbGFzcyBpcyBqdXN0IG5vdCBhIHBvc3NpYmlsaXR5LiBJbiB0aGF0IGNhc2UsIHRoZSBydWxlcyBjYW4gYmUgcmVsYXhlZCwgYnV0IG9uIGEgbXVjaCBtb3JlIHByaW5jaXBlZCBiYXNpcy48L3A+PHA+TWF1cml6aW88YnI+PC9wPjxkaXYgY2xhc3M9Im1vei1jaXRlLXByZWZpeCI+T24gMTAvMTIvMjAyNCAyMjo0NywgQ2hlbiBMaWFuZyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgdHlwZT0iY2l0ZSIgY2l0ZT0ibWlkOkNBQmU4dUUwZzZ0TUNWWTI5M2hXc3lZYThmVmtaeEgtZnJZOSs1dHd1eENfY2pTeEZfQUBtYWlsLmdtYWlsLmNvbSI+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7ICI+PHAgZGlyPSJsdHIiPkhpIEFyY2hpZSw8YnI+CkkgdGhpbmsgdGhpcyBydWxlIG1ha2VzIHNlbnNlIC0gTG9jYWwxIGNhbiBjYXB0dXJlIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgb3V0ZXIgY2xhc3MgaW5pdGlhbGl6ZXIsIGluIHdoaWNoIGNhc2UgdGhlIGVycm9yIHdpbGwgYmUgbGVnaXRpbWF0ZS4gVGhlIGV4dHJhIG90aGVyd2lzZSBkb2VzIG5vdCBmaXggdGhpcyBpc3N1ZS4gQWRkaW5nIGEgc3BlY2lhbCBjYXNlIHRvIGFsbG93IG5vLWNhcHR1cmUgbG9jYWwgY2xhc3NlcyB0byBiZSB1c2VkIGluIG1vcmUgbmVzdGVkIHN0YXRpYyBjb250ZXh0cyBzZWVtcyBvdmVya2lsbCBhbmQgZXJyb3ItcHJvbmUuPC9wPgo8cCBkaXI9Imx0ciI+Q2hlbjwvcD4KPGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+T24gVHVlLCBEZWMgMTAsIDIwMjQsIDM6NTfigK9QTSBBcmNoaWUgQ29iYnMgJmx0OzxhIGhyZWY9Im1haWx0bzphcmNoaWUuY29iYnNAZ21haWwuY29tIiBtb3otZG8tbm90LXNlbmQ9InRydWUiPmFyY2hpZS5jb2Jic0BnbWFpbC5jb208L2E+Jmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGRpdj48ZGl2PlRoZSBwcm9wb3NlZCBKTFMgY2hhbmdlcyBmb3IgSkVQIDQ5MiBhcmUgc2F5aW5nIHRoYXQgdGhpcyBleGFtcGxlIHNob3VsZCBubyBsb25nZXIgY29tcGlsZSo6PGJyPjwvZGl2PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBzdGF0aWMgezxicj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgY2xhc3MgTG9jYWwxIHs8YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgY2xhc3MgTG9jYWwyIHs8YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBwdWJsaWMgc3RhdGljIHZvaWQgbSgpIHs8YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IG5ldyBMb2NhbDEoKTsmbmJzcDsgLy8gZXJyb3I8YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyB9PGJyPiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IH08YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IH08YnI+Jm5ic3A7ICZuYnNwOyB9PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5idXQgdGhhdCBzZWVtcyB3cm9uZyAtIHRoYXQgZXhhbXBwbGUgaGFzIGJlZW4gYWxsb3dlZCBzaW5jZSBKREstODI1NDMyMSwgYW5kIGFzIGl0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggZmxleGlibGUgY29uc3RydWN0b3JzLCBpdCBzaG91bGQgY29udGludWUgdG8gYmUgYWxsb3dlZC48YnI+PC9kaXY+PC9kaXY+PGRpdiBkaXI9Imx0ciI+PGJyPjwvZGl2PjxkaXY+VGhlIEpFUCA0OTIgc3BlYyBzYXlzIChuZXcgYWRkaXRpb25zIGluIGJvbGQpOjwvZGl2PjxkaXY+PHA+Jm5ic3A7IElmIDxlbT5DPC9lbT4gaXMgYW4gaW5uZXIgbG9jYWwgY2xhc3MsIHRoZW46PC9wPgo8dWw+PGxpPjxwPklmIDxlbT5DPC9lbT4gb2NjdXJzIGluIGEgc3RhdGljIGNvbnRleHQsIHRoZW4gPGVtPmk8L2VtPiBoYXMgbm8KaW1tZWRpYXRlbHkgZW5jbG9zaW5nIGluc3RhbmNlLiA8c3Ryb25nPkxldCA8ZW0+UzwvZW0+IGJlIHRoZSBuZWFyZXN0Cjxjb2RlPnN0YXRpYzwvY29kZT4gbWV0aG9kIGRlY2xhcmF0aW9uLCA8Y29kZT5zdGF0aWM8L2NvZGU+IGZpZWxkCmRlY2xhcmF0aW9uLCBvciBzdGF0aWMgaW5pdGlhbGl6ZXIgdGhhdCBlbmNsb3NlcyB0aGUgZGVjbGFyYXRpb24gb2YKPGVtPkM8L2VtPi4gSWYgdGhlIG5lYXJlc3QgPGNvZGU+c3RhdGljPC9jb2RlPiBtZXRob2QgZGVjbGFyYXRpb24sCjxjb2RlPnN0YXRpYzwvY29kZT4gZmllbGQgZGVjbGFyYXRpb24sIG9yIHN0YXRpYyBpbml0aWFsaXplciB0aGF0CmVuY2xvc2VzIHRoZSBjbGFzcyBpbnN0YW5jZSBjcmVhdGlvbiBleHByZXNzaW9uIGlzIG5vdCA8ZW0+UzwvZW0+LCB0aGVuCmEgY29tcGlsZS10aW1lIGVycm9yIG9jY3Vycy48L3N0cm9uZz48L3A+CjwvbGk+PC91bD48L2Rpdj48ZGl2PlNob3VsZCB0aGVyZSBiZSBhbiA8Yj5PdGhlcndpc2U8L2I+IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ld2x5IGFkZGVkIHNlbnRlbmNlPyAoQW5kIHNhbWUgdGhpbmcgaW4gdGhlIHByZXZpb3VzIHBhcmFncmFwaCByZWdhcmRpbmcgYW5vbnltb3VzIGNsYXNzZXMpPGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+LUFyY2hpZTxicj48L2Rpdj48ZGl2IGRpcj0ibHRyIj48YnI+PC9kaXY+PGRpdiBkaXI9Imx0ciI+KiBTZWUgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLm9wZW5qZGsub3JnL2Jyb3dzZS9KREstODM0NTk1MyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9yZWZlcnJlciIgbW96LWRvLW5vdC1zZW5kPSJ0cnVlIj5KREstODM0NTk1MzwvYT4gSkVQIDQ5MjogaW5zdGFudGlhdGluZyBsb2NhbCBjbGFzc2VzIGluIGEgZGlmZmVyZW50IHN0YXRpYyBjb250ZXh0IHNob3VsZCBub3QgYmUgYWxsb3dlZDwvZGl2PjxkaXYgZGlyPSJsdHIiPjxzcGFuIGNsYXNzPSJnbWFpbF9zaWduYXR1cmVfcHJlZml4Ij48YnI+PC9zcGFuPjwvZGl2PjxkaXYgZGlyPSJsdHIiPjxzcGFuIGNsYXNzPSJnbWFpbF9zaWduYXR1cmVfcHJlZml4Ij4tLSA8L3NwYW4+PGJyPjxkaXYgZGlyPSJsdHIiIGNsYXNzPSJnbWFpbF9zaWduYXR1cmUiIGRhdGEtc21hcnRtYWlsPSJnbWFpbF9zaWduYXR1cmUiPkFyY2hpZSBMLiBDb2Jiczxicj48L2Rpdj48L2Rpdj4KPC9kaXY+CjwvYmxvY2txdW90ZT48L2Rpdj4KCjwvYmxvY2txdW90ZT48dWwgY2xhc3M9ImRyb3Bkb3duLW1lbnUgdGV4dGNvbXBsZXRlLWRyb3Bkb3duIiBzdHlsZT0iZGlzcGxheTogbm9uZTsgcG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxMDAwOyIgY29udGVudGVkaXRhYmxlPSJmYWxzZSI+PC91bD4=" aria-hidden="true" style="font-size: 0px; padding: 0px; margin: 0px; block-size: 0px; height: 0px; inline-size: 0px; max-block-size: 0px; max-height: 0px; max-inline-size: 0px; max-width: 0px; overflow-block: hidden; overflow-inline: hidden; overflow: hidden; width: 0px;" class="mdhr-raw">​</div>
</div>
</body>
</html>