Replace the primitive class with a more general null safety?

Brian Goetz brian.goetz at oracle.com
Thu Dec 1 18:34:27 UTC 2022



On 12/1/2022 12:50 PM, Glavo wrote:
> Optional.val? Do you mean that the reference-favoring primitive class 
> still exists?

Not quite.

The names in the model have changed over the iterations, but the 
concepts basically have stayed the same.  Some of the classes we want to 
write with Valhalla are just "objects without identity", but are not 
really "like primitives"; LocalDateTime is an example of this.  Others 
are much closer to pure numerics, such as Complex or HalfFloat, and are 
much more "like primitives".  A key difference is that one has a natural 
zero and can therefore be used uninitialized (like int fields), whereas 
the other does not and therefore must be handled through a reference, 
whose initial value is null.  (Though we can still obtain some 
substantial optimizations even for these reference types.)  We've been 
calling these "bucket 2" (objects without identity) and "bucket 3" 
(primitive-like types), which in the more recent model were described 
with value classes and primitive classes.

Regardless of the stacking, a primitive class gives rise to TWO types, 
which I'll call P.val and P.ref here.  One is a reference type, the 
other is a value type.  These are analogous to int and Integer, and they 
have the usual array of differences: nullability, default values, direct 
vs indirect, tearing under race, etc.

A pretty clear decision that has emerged is that for both

     value class V { }
and
     primitive class P { }

the language-level types V and P are *reference types* (so P is an alias 
for P.ref in the ref/val model.)  I won't rehash the arguments in favor 
and against here, but this means any "unadorned" type is a reference 
type, regardless of whether it is an identity, value, or primitive 
class.  In this way, all primitive/value classes are "ref favoring", and 
there's no explicit way to flip this, so no need for the 
ref-default/val-default syntax of a previous round.  One of the benefits 
of this is that migration is smoother because migrating an identity 
class to either of the new buckets is source- and binary-compatible.

> For migration related matters, I don't think you need me to introduce 
> these, but I just remind you that although they are very basic,
> they often don't get the attention they deserve, thus becoming an 
> obstacle to migration.

One of the reasons Valhalla is taking so long is we take migration 
compatibility very seriously.





More information about the valhalla-dev mailing list