Assertions in static blocks ?
Ulf Zibis
Ulf.Zibis at gmx.de
Tue Mar 9 13:03:17 PST 2010
Am 09.03.2010 19:53, schrieb Jonathan Gibbons:
> Ulf Zibis wrote:
>> 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?
>>
>>>
>>>> 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
>>
>>
>
> There's a default constructor on the class, allowing you to write "new
> EUC_TWMapping3()".
Much thanks for that example.
Thinking about, that there is no value for such an object, I too would
prefer to assign that example to group (2).
-Ulf
More information about the compiler-dev
mailing list