What Chen said.

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.

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 /static/ 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.

Maurizio

On 10/12/2024 22:47, Chen Liang wrote:

Hi Archie,
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.

Chen


On Tue, Dec 10, 2024, 3:57 PM Archie Cobbs <[email protected]> wrote:

    The proposed JLS changes for JEP 492 are saying that this example
    should no longer compile*:

        static {
            class Local1 {
                class Local2 {
                    public static void m() {
                        new Local1();  // error
                    }
                }
            }
        }

    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.

    The JEP 492 spec says (new additions in bold):

      If /C/ is an inner local class, then:

     *

        If /C/ occurs in a static context, then /i/ has no immediately
        enclosing instance. *Let /S/ be the nearest |static| method
        declaration, |static| field declaration, or static initializer
        that encloses the declaration of /C/. If the nearest |static|
        method declaration, |static| field declaration, or static
        initializer that encloses the class instance creation
        expression is not /S/, then a compile-time error occurs.*

    Should there be an *Otherwise* at the beginning of the newly added
    sentence? (And same thing in the previous paragraph regarding
    anonymous classes)

    -Archie

    * See JDK-8345953 <https://bugs.openjdk.org/browse/JDK-8345953>
    JEP 492: instantiating local classes in a different static context
    should not be allowed

-- Archie L. Cobbs

&#8203;

Reply via email to