Reviewer and committer request for 7198496

Paul Sandoz paul.sandoz at oracle.com
Thu Oct 4 11:56:59 UTC 2012


On Oct 4, 2012, at 12:37 PM, David Holmes <david.holmes at oracle.com> wrote:

> Paul,
> 
> On 4/10/2012 7:53 PM, Paul Sandoz wrote:
>> On Oct 4, 2012, at 11:34 AM, David Holmes<david.holmes at oracle.com>  wrote:
>>>> 
>>>>> These parts of the javadoc for get/setContextClassLoader are simply wrong.
>>>>> 
>>>> 
>>>> Wrong or not because of such JavaDoc developers have been coding using TCCL with certain expectations of "null" different to that of just meaning the bootstrap CL.
>>>> 
>>>> How would you propose to fix it?
>>> 
>>> I don't see anything that actually needs fixing (apart from the javadoc). Anyone using getCCL has to expect null as a possibility and they are then free to proceed however they like. The obvious ways to proceed are as I outlined earlier:
>>> - use current classloader
>>> - use system loader
>>> - use bootstrap loader
>>> 
>> 
>> So you are proposing to widen the scope? since i interpret the current JavaDoc to correspond to only the latter two options.
> 
> I think you are missing the point. If getCCL returns null it returns null - end of story.

> What the caller of getCCL does after that is their business, it has nothing to do with the spec for getCCL.

I think we may be misunderstanding and/or talking over each other. IIUC you are saying what behaviour you would like and i am saying how i interpret the current behaviour.

I interpret the current JavaDoc as normatively stating what the caller of getCCL *must* do if null a value is returned.

A little tweak to the doc might help:

From:

"@return  the context ClassLoader for this Thread, or {@code null} indicating the system class loader (or, failing that, the bootstrap class loader)"

To:

"@return  the context ClassLoader for this Thread, or {@code null} indicating the caller shall use the system class loader (or, failing that, the bootstrap class loader) in place of what would otherwise be the non-null context ClassLoader."

Because TCCL has the annoying property of decoupling behaviour (or "action at a distance") i think i can see why it was documented in such a way.


So from my perspective you are proposing a change in the specified behaviour, perhaps to something like:

@return  the context ClassLoader for this Thread, or {@code null} indicating the context ClassLoader is undefined. It is recommended that ...

Which might be fine, from a backwards compatibility perspective, i am not sure, but i have been on the receiving end of some very tricky bugs due to TCCL, hence a conservative position.


<snip>
>  loader = (cl == null) ? ClassLoader.getSystemClassLoader() : cl;
> 
> which has the same semantic effect, but leaves some "dead" code internally as now loader can not be null.
> 

It can if the system CL is null.

Paul.


More information about the core-libs-dev mailing list