RFR 8169435 : ClassLoader.isParallelCapable is final and conflicting method may get VerifyError

Mandy Chung mandy.chung at oracle.com
Mon Nov 14 21:23:53 UTC 2016


> On Nov 12, 2016, at 3:04 AM, forax at univ-mlv.fr wrote:
> 
> Hi Mandy,
> getName() is used for debugging so if it's the wrong name which is picked, is not a big deal, the stacktrace will be just a little weird,
> that's why i think it's fine to make getName non static and non final, because accidental overriding is not harmful.
> 
> Accidental overriding of isParallelCapable is harmful.
> 

That’s a good point.

> In term of design the main issue with a static method is the discoverability issue, if a user hit ctrl + space, a static method will not be among the proposed methods.
> so i'm fine with a final isRegisteredAsParallelCapable if you think that users should be aware that this method exist.
> 

I am doing a scan on the corpus I have (an old snapshot of maven artifacts outdated but hope to represent a good set of samples).  

So far, I only found one ClassLoader subclass defining isParallelCapable method [1].  I haven’t found any use of isRegisteredAsParallelCapable method.

Mandy
[1] org.eclipse.osgi:org.eclipse.osgi:3.7.1 (and other versions)

> regards,
> Rémi
> 
> ----- Mail original -----
>> De: "Mandy Chung" <mandy.chung at oracle.com>
>> À: "Remi Forax" <forax at univ-mlv.fr>
>> Cc: "David M. Lloyd" <david.lloyd at redhat.com>, "core-libs-dev" <core-libs-dev at openjdk.java.net>
>> Envoyé: Samedi 12 Novembre 2016 00:10:13
>> Objet: Re: RFR 8169435 : ClassLoader.isParallelCapable is final and conflicting method may get VerifyError
> 
>> While this could be made as a static method, there are cases that an instance
>> method would be preferred and same compatibility would arise.  For example,
>> ClassLoader::getName is non-final instance method as it stands and I’d be
>> reluctant to make it a static method taking a ClassLoader instance.
>> 
>> It would be nice to support @PromoteToFinalMethod to allow a new method be
>> non-final when it’s added and promote to a final method in a future release
>> allowing existing code to transition.
>> 
>> My preference is to go with ClassLoader::isRegisteredAsParallelCapable final
>> instance method and the chance of the name clash may be low (Brent did some
>> search from grepcode and at least not finding that name yet.  Of course this is
>> not bullet-proof).
>> 
>> Mandy
>> 
>>> On Nov 11, 2016, at 9:13 AM, Remi Forax <forax at univ-mlv.fr> wrote:
>>> 
>>> Hi David,
>>> you can not override a static method :)
>>> but there is still a corner case, you can have a conflict when you have a method
>>> reference over an instance method and you introduce a static method that have
>>> the same functional signature.
>>> 
>>> Given that i prefer to have a compile time error than a strange behavior at
>>> runtime (if there is an accidental overriding),
>>> I vote for the static method too.
>>> 
>>> cheers,
>>> Rémi
>>> 
>>> ----- Mail original -----
>>>> De: "David M. Lloyd" <david.lloyd at redhat.com>
>>>> À: core-libs-dev at openjdk.java.net
>>>> Envoyé: Vendredi 11 Novembre 2016 16:03:44
>>>> Objet: Re: RFR 8169435 : ClassLoader.isParallelCapable is final and	conflicting
>>>> method may get VerifyError
>>> 
>>>> On 11/11/2016 05:07 AM, Alan Bateman wrote:
>>>>> 
>>>>> 
>>>>> On 11/11/2016 10:46, Vladimir Ivanov wrote:
>>>>>> Alan,
>>>>>> 
>>>>>> I've looked through the current thread and also review thread [1] for
>>>>>> original change (8165793), but haven't found any discussion why making
>>>>>> it static (instead of instance final) is undesirable.
>>>>>> 
>>>>>> Can you shed some light on it? Is it mainly usability concern
>>>>>> (loader.isParallelCapable() vs ClassLoader.isParallelCapable(loader))?
>>>>> I assume you mean to address this to Brent rather than me, but yes, an
>>>>> instance method would be nicer (if we can get away with it).
>>>> 
>>>> I think the question was "why not?".  A static method can never
>>>> conflict, and doesn't have a usability impact.  A final method can
>>>> always conflict, and a non-final method is always potentially
>>>> problematic for the multiple reasons already stated on this thread.
>>>> 
>>>> By score, static wins.  So, why not?
>>>> --
>>>> - DML



More information about the core-libs-dev mailing list