Assertions in static blocks ?

David Holmes - Sun Microsystems David.Holmes at Sun.COM
Tue Mar 9 14:18:20 PST 2010


Ulf Zibis said the following on 03/10/10 03:39:
> Am 08.03.2010 23:48, schrieb David Holmes - Sun Microsystems:
>> Ulf Zibis said the following on 03/08/10 22:40:
>>> Am 07.03.2010 23:20, schrieb David Holmes - Sun Microsystems:
>>>> I'm with Keith and Neal, this is all "working as designed". How can 
>>>> javac in general know whether or not a class will be initialized.
>>>
>>> This is not the question here. The question is if it *can* be 
>>> initialized, (1) via standard java instruction or (2) via any other 
>>> special magic like reflective call from Class.forName(). javac surely 
>>> has knowledge about that.
>>
>> Both (1) and (2) depend on your whole program not the class being 
>> compiled. So javac can not know the answer to this at compile time.
> 
> Sorry, maybe I'm missing something. Can you give me an example how 
> static initializer could be triggered by (1), if there are only static 
> final  primitive type constants in that class?

In that case it can't. And as I said previously the special case where a 
class consists only of these constant fields (initialized by 
compile-time constant expressions) but still has a static initializer, 
could be a case where javac issued a warning.

If you feel this strongly about it just file an RFE or prepare a fix.

Cheers,
David Holmes

>>
>>> If (1) could never be reached, there should be a warning, in 
>>> particular for less experienced programmers, E.g.:
>>> "static initializer will never be triggered by any member or method 
>>> of this class. Could only be invoked by loading the class explicitly 
>>> or inherently(not sure)"
>>
>> No that doesn't make sense. A classes own methods/members are not the 
>> trigger for classloading and/or initialization. It is the use of those 
>> methods/members by other classes that triggers the 
>> loading/initialization of the class containing the method/member.
> 
> Sorry for the bad wording, I meant "... triggered by access to any 
> member or method of this class. ..."
> or "There are no members or methods which could trigger the static 
> initializer to run, so it may be never reached. ..."
> 
>>
>>>> A static initializer is no different to a method or constructor in 
>>>> that regard: none of them are ever flagged as unreachable because 
>>>> that can't be determined a-priori by javac.
>>>
>>> IMHO there is a _big_ difference on normal constructors and methods:
>>> 1. They _can_ always be executed by normal java instruction.
>>> 2. They will _never_ be executed, if not explicitly called from code.
>>> On static initializers it's quite different:
>>> 1. They _cannot_ be executed by normal java instruction.
>>> 2. They will _mostly_ be _automatically_ executed but not ever, if a 
>>> member/method from it's class is called
>>
>> The implicit vs explicit nature of the execution doesn't change the 
>> fact that to determine if either is executed you need to look at the 
>> whole program - not just the class(es) being compiled.
> 
> Yes, but I can't imagine any other trigger than meant under (2).
> 
> Hope, that I'm bothering too much,
> 
> -Ulf
> 
> 



More information about the compiler-dev mailing list