More constraints on nesting that could be relaxed

Anthony Vanelverdinghe anthonyv.be at outlook.com
Thu Jan 23 17:35:01 UTC 2020


For the record (no pun intended), this is tracked by [1], in which John 
describes the design pattern I'm interested in: combining a public 
factory method with a private member type that provides the instances.

Kind regards, Anthony

[1] https://bugs.openjdk.java.net/browse/JDK-8182549

On 22/01/2020 19:52, Brian Goetz wrote:
> Understood; restricting to methods only here was probably gratuitously 
> bespoke.  I would indeed like to clean this up too (though, while it 
> might sound like a "one line change to the compiler", it is actually 
> way more work than it sounds, because it affects both JLS and JVMS, so 
> requires code changes not only in javac but in the runtime, along with 
> JCK and spec changes for both language and VM.)
>
> (On the other hand, the less narrowly-targeted the set of changes are, 
> the more it is to become an attractive nuisance, where people seek to 
> characterize their favorite bit of non-orthogonality or chafing 
> restriction as a "better nesting" proposal, in the hopes of jumping on 
> the bus.)
>
> The main question is how.  It seems justifiable for the Records JEP to 
> expand somewhat beyond the boundary of record-specific functionality 
> so that it can "complete" rows or columns on the feature matrix; by 
> this, it is reasonable to address the static-in-inner restrictions 
> (because that impinges on nested records) and local enums/interfaces 
> (because these are row-completing moves.)  On the other hand, trying 
> to cram local methods in with records is clearly way over the line, 
> and things like this are somewhere near the line and could probably be 
> pulled in (this impinges on "private records in interfaces.")
>
> If they were impractical to do as part of the remaining records effort 
> (either because it is too far from the design center of records, or 
> because we don't want to burden the records timeline with this), it is 
> not obvious what the best alternative delivery vehicle is.  Seems too 
> small for a JEP on its own; we don't do language features without 
> JEPs; and while a general "better nesting" JEP is possible, as per the 
> above "other hand" comment it is likely to be a sort of attractive 
> nuisance.
>
>
>
>
>
> On 1/22/2020 1:19 PM, Alan Malloy wrote:
>> The recent thread about "cleaner nesting" reminded me of a related 
>> language constraint that has caused me a bit of a headache recently, 
>> and I wonder if we can clean it up at the same time.
>>
>> Somewhat recently, interfaces have gained the ability to have private 
>> methods, for use as helpers in implementing default methods. 
>> However, there is currently no plan for private fields or private 
>> nested classes to be allowed in those contexts, even private static 
>> final fields. I don't see any particularly compelling reason for 
>> this: private fields made no sense for interfaces in Java 1.0, but 
>> since interfaces can now have private behavior, it makes sense for 
>> them to have private state to support that behavior, or at the very 
>> least private constants.
>>
>> For example, it seems like it should be totally fine to write:
>>
>> interface Actor {
>>   private static final Logger logger = new Logger();
>>   default void act() {
>>     logger.log("act not implemented");
>>   }
>> }
>>
>> But this is illegal because logger is not permitted to have the 
>> private modifier. Instead, you have to either make the logger public 
>> (polluting the namespace of inheriting classes and breaking 
>> encapsulation of your interface), or else invent some public class 
>> that's allowed to hold a private method (still polluting the 
>> namespace, but keeping the field hidden):
>>
>> interface Actor {
>>   /** Do not use. */
>>   public static final class Private {
>>     private static final Logger logger = new Logger();
>>   }
>>   default void act() {
>>     Private.logger.log("act not implemented");
>>   }
>> }
>>
>> Is this something we could include in the overall nesting reform plan?
>


More information about the amber-spec-observers mailing list