no good default issue
Brian Goetz
brian.goetz at oracle.com
Sat Aug 1 14:41:11 UTC 2020
> Personally, I view such tactics as possible but expensive,
> and would like to try to get by without JVM support for
> them, to start with. The JVM engineering teams are already
> overworked for Valhalla.
>
And, more than that. The technique of "ask a no-arg ctor" (or some
other stateless source) only works for the classes in Bucket 2, which,
as Dan and Kevin have pointed out, are actually the smaller and far less
interesting group than Bucket 3, where there is simply no good default,
and anything returned by the no-arg ctor would just be a different
flavor of ad-hoc null.
One example of such a class is:
inline record Name(String first, String last) { }
What would be the default? Two empty strings? Strings containing
"<no-name>"? Are those really better than (null, null)?
Kevin has argued that Date equally belongs in this bucket. Sure, we can
interpret 1970 as the default date, but in the situations where someone
uses an uninitialized date, what percentage of the time are they
satisfied with 1970 as the result? I don't think it's going out on a
limb to say "not that often." And if the date is used as an input to,
say, an interest calculation, that's pretty bad.
The lesson of the most recent discussion is that "let the user pick the
default" is not really better, and often worse, than "let zero be the
default." Really, this is not about defaults, but about detecting use
of uninitialized data.
Refs don't have this problem, because when you try to do anything
nontrivial with a null (other than move it around or compare it to
another ref), the VM tells you clearly that you tried to use
uninitialized data.
By the NNN Directive, winning looks like, to the extent we do anything
here, aligning the behavior of dereferencing an uninitialized NGD value
with that of dereferencing a null.
More information about the valhalla-spec-experts
mailing list