I do, because the other way to get a class into the same compilation unit, aux 
classes, have some limitations.  So we’re encouraging the pattern of nesting.  
But … I am not sure we want to push it all the way.  Consider a type like:

    sealed interface Fruit {
        interface RedFruit extends Node { }
        interface BlueFruit extends Node { }
        class Strawberry implements RedFruit { }
        class Raspberry implements RedFruit { }
        class Blueberry implements BlueFruit { }
    }

Do we want to force Blueberry to be Fruit.BlueFruit.Blueberry (or at least, 
twist the user’s arm into it by offering less ceremony?)  I think that would be 
lame — and worse than lame if the intermediate interfaces (RedFruit, BlueFruit) 
were not public.  Then we’d be nesting the public types in the nonpublic ones, 
and they’d be inaccessible.  

> You often show the concrete classes as members of a sealed interface. 
> Interface members are already implicitly public and static; is this a 
> precedent to build on for a sealed interface? That is, have the nested 
> concrete classes be implicitly final, and have the interface's implicit 
> `permits` list care about only nested concrete classes. Top level concrete 
> classes in the same compilation unit would be handed like concrete classes in 
> other compilation units: nothing different than today.
> 
> Layering sealing on top of nesting has the attraction that it avoids putting 
> multiple public concrete classes in a single compilation unit. It's right 
> that the concrete leaves are public, but javac dislikes compilation units 
> with multiple public types.
> 
> Alex

Reply via email to