Classes, specializations, and statics
Brian Goetz
brian.goetz at oracle.com
Fri Feb 19 00:54:53 UTC 2016
> Based on the example above, I think we need to be more explicit about
> how the <clinit> method is handled.
> There are really two different sets of statics that need to be handled
> by the class initialization:
> A) common statics (shared across all instantiations)
> B) specialized statics
> In addition to the statics, there is also common (and maybe
> specialized?) code that is run as part of <clinit>.
There is a reasonable model to collapse these back into one concept;
treat "common statics" as specialized statics on the all-erased
parameterization, with a <where> clause that restricts them to that
parameterization. Not clear whether we actually want to represent it
that way or not, but its a useful mental model that doesn't require the
creation of a third thing. (Since Class[Foo] and ParamType[Foo,erased*]
describe the same class, this is also fully binary compatible with
existing classes.)
Which means we can do a similar thing with <clinit>, if we want. I'll
wave my hands because we've not yet talked much about conditional
members, but it basically looks like this:
<where T*=erased*>
<init>() { /* common static init code */
/* specializable init code */ }
<init>() { /* specializable init code */ }
Or not.
> Where will the initialization code for both kinds of statics be? The
> existing <clinit> method?
We have two choices:
- have a new <sclinit> block that gets run once per specialization,
and keep <clinit>
- merge the two as above, exploiting planned support for conditional
members
Either way, as you say, we have to ensure that the common init runs
exactly once.
> When using *static, are we only discussing {get,put}? Or is this also
> proposing invokestatic changes to allow specialized static methods?
Methods too.
> All of the technical details aside, is this something we really want
> to expose to the users? They're going to have a hard time
> understanding why Foo<int> (or Foo<ValueType) gets specialized statics
> while Foo<String> & Foo<Bar> share the erased version.
I think this is mostly a matter of coming up with the right syntax,
which makes it clear that statics can be per-class or
per-specialization. There are a whole pile of related
specialization-related syntax issues, I'll try to get them all in one
place.
More information about the valhalla-spec-observers
mailing list