Static fields and specialization

Peter Levart peter.levart at gmail.com
Tue Jan 13 08:32:01 UTC 2015


On 01/12/2015 05:11 PM, Brian Goetz wrote:
>> You probably misunderstood me (again) :(
>>
>> Richard suggested that you can keep speed of Optional.empty() by
>> creating separate layers for <ref T>, <int T>, etc...
>
> Remember, for value types (hopefully Optional will be one), 
> instantiation is essentially free, and in most cases where this idiom 
> is used, it is the allocation that we're trying to optimize away.  So 
> the idiom of "cache one and return the same instance", in these cases, 
> can be retired.
>
> I realize this still doesn't help us for reference types, like 
> Collections.emptyList(); this point got made a while ago (so it didn't 
> occur to me we were still talking about it.)
>
>

Hi,

"generic" or "specialized" static fields are a concept I have been 
thinking of too, but their initialization presents a lot of challenges 
and consequently possible irregularities in language. The example we 1st 
imagine is of course the following:

On 01/12/2015 01:51 PM, Palo Marton wrote:
> private static final <any T> Optional<T> EMPTY = new Optional<T>();
>
> This will compile initializing expression to generic static method:
>
> private static <any T> Optional<T> EMPTY$init() {
>     return  new Optional<T>();
> }
>


...but we know that classic static fields can be initialized in 
hand-crafted static initializers too:

static final int x;
static {
     ...
     x = ...
}

So the next logical thing we consider is "generic" or "specialized" 
static initialization blocks:

On 01/12/2015 02:26 PM, MacGregor, Duncan (GE Energy Management) wrote:
> That sounds fundamentally okay, but probably also requires a typed static
> initialiser syntax for fields that could throw an exception during
> initialisation.
>
> Something like
>
> static final <any T> MethodHandle mh;
>
> static <any T> {
> 	try {
> 		// Do MethodHandle lookup
> 	} (catch e) {
> 		Throw new Error();
> 	}
> }

...but we can argue that above syntax is unsound. Currently there's no 
construct in Java language that would associate two lexicaly independent 
scopes together just by the name of generic type variable. Above two 
"any Ts" are distinct type variables. So we might need a top-level 
static scope that would allow declaring anything - from static fields to 
static initializer blocks and/or static methods.

We already have all that. Just remove the word "static" - it's the 
class! So what Java might need is singleton objects (similar to Scala's):

public object Singleton<any T> {

     final T specializedValue;

     Singleton() {
         ...
         specializedValue = ...
     }
}

Before you argue that such specializedValue can not be constant, 
hold-back...

The @java.lang.invoke.Stable annotation has shown that VM already has 
support for constant-folding such final instance fields. Voila, here's 
the syntax to make this functionality "public".

Serialization can be extended to support such singleton objects in a 
special way (like enums), reflection can be special-cased for such 
classes (don't allow setting final instance fields), so @Stable 
attribute can be apppied to them...


Regards, Peter




More information about the valhalla-dev mailing list