nest syntax proposal

Brian Goetz brian.goetz at oracle.com
Sun Jan 20 21:43:06 UTC 2019


So, there are about 100 people in the world who know what “nest mates” means, which is a huge black mark against introducing an explicit “nest” concept into the language.  Nest mates has been a low-level implementation detail, and the fact that it it is hidden from the user model is a feature, not a bug.  This is a big new concept to teach to a large audience that doesn’t yet have any conception of it.  So far, the benefits do not remotely outweigh the degree to which it exposes new complexity to everyone.  

I would much prefer a solution that builds on existing concepts that people already understand, than one that requires them to learn a new concept just to support a particular use of a new feature.  

People understand import.  And they understand auxiliary classes.  Let’s work with the familiar concepts.  

> On Jan 20, 2019, at 4:31 PM, forax at univ-mlv.fr wrote:
> 
> ----- Mail original -----
>> De: "Brian Goetz" <brian.goetz at oracle.com>
>> À: "Remi Forax" <forax at univ-mlv.fr>
>> Cc: "amber-spec-experts" <amber-spec-experts at openjdk.java.net>
>> Envoyé: Dimanche 20 Janvier 2019 18:04:00
>> Objet: Re: nest syntax proposal
> 
>> This is a nice example of “today’s problems come from yesterday’s solutions.”
>> In Java 1.1, we did nested classes, and they were pretty cool, but there were
>> some mismatches between the language model and the runtime model, which had
>> some sharp edges.  So, as a solution to that problem, we taught the JVM about
>> the notion of “nest”, to align the two.  The intent, at the time, was that the
>> natural syntax for nests was — nesting.
>> 
>> Now, you’re saying that it kinds of stinks that we have to take all the
>> properties of nests (shared access control, hierarchical namespace) or none of
>> them, and you’d like to introduce a way to get the first without the second.
>> It’s a fair idea.
> 
> Yes, i see the fact that in Java the language force classes to be enclosed to have private access as an accidental complexity. The JVM has no such requirement so i propose to reconcile the language and the VM netsmates. 
> 
>> 
>> However, I think I’d solve the problem — which is that it is irritating to have
>> to say FruitBasket.Apple all the time, rather than Apple — more directly?  Like
>> some sort of more powerful “import”.  For example:
>> 
>>   import enum Foo;
>> 
>> could import the Foo enum class, _plus_ import-static all its constants.  (And
>> something similar for sealed classes, of course).
> 
> In a sense, you are doubling-down on the notion of hierarchy, or at least of enclosing, by saying that you have an "import tree" that can import a set of types that are declared inside another one. 
> 
> The main issue with your solution is that you can not retrofit an existing hierarchy/set of classes to this new scheme because moving a class inside another change its name so it's not a backward compatible change hence the idea to de-couple nestmates access and nested classes.
> 
> Rémi
> 
>> 
>>> On Jan 20, 2019, at 7:49 AM, Remi Forax <forax at univ-mlv.fr> wrote:
>>> 
>>> Hi all,
>>> as Brian said recently, we have an issue because we are shortening the class
>>> declaration (with records) or wants to declare in a single compilation unit a
>>> hierarchy of types (with sealed types) and currently Java requires that a
>>> compilation unit can only have one public class.
>>> 
>>> One solution is to get ride of this constraint, because it may be a good idea in
>>> 1995 but today we are writing programs that have far more classes (the
>>> introduction of modules recently was also driven by that idea). I propose
>>> another way of solving that issue, introducing a mechanism to opt-in to have
>>> more than one public class in a compilation unit.
>>> 
>>> Currently we have the mechanism of nestmates which has a runtime representation
>>> (VM + reflection) but no language representation, i propose to introduce a new
>>> declaration in the language in between the package declaration and the first
>>> import,
>>> nest NestHostClass;
>>> which define the class that will be used as nest host (obviously it can be
>>> another keyword instead of "nest").
>>> 
>>> So a closed hierarchy can defines like this in one compilation unit:
>>> nest Expr;
>>> 
>>> public sealed Expr permits Variable, Value, Add;
>>> public record Variable(String name) implements Expr;
>>> public record Value(int value) implements Expr;
>>> public record Add(Expr left, Expr right) implements Expr;
>>> 
>>> at runtime, Variable.class.getNestHost() == Expr.class
>>> 
>>> Another simpler example
>>> nest FruitBasket;
>>> 
>>> public record Fruit(String name);
>>> 
>>> public class FruitBasket {
>>>   private final ArrayList<Fruit> fruits = new ArrayList<>();
>>> 
>>>   public void add(Fruit fruit) {
>>>     Objects.requireNonNull(fruit);
>>>     fruits.add(fruit);
>>>   }
>>> }
>>> 
>>> at runtime, Fruit.class.getNestHost() == FruitBasket.class
>>> 
>>> I believe that the nest host class defined by the keyword "nest", doesn't have
>>> to be public, but it's not a qualified name (obviously) and the class has to be
>>> defined in the compilation unit.
>>> 
>>> Defining a nest can be seen as an extension of the case with only one class, if
>>> there is only one class in the compilation unit, the class is it's own nest
>>> host.
>>> If there is more than one class in the compilation unit, but only one class is
>>> public, currently, they are not nestmates, i think we should not do anything to
>>> try to retcon that compilation unit because this case is rare (one may argument
>>> that if we introduce the nest syntax, it can be more frequent). Also the
>>> compiler message should be tweaked if there are more than one public classes to
>>> say that a nest can be defined.
>>> 
>>> Rémi

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/amber-spec-experts/attachments/20190120/591011a6/attachment-0001.html>


More information about the amber-spec-experts mailing list