RFR(m): 8145468 deprecations for java.lang

Brian Goetz brian.goetz at oracle.com
Thu Apr 14 17:13:42 UTC 2016


Or, better, don’t do that in ASM, and instead use .equals()?  

> On Apr 14, 2016, at 9:21 AM, Remi Forax <forax at univ-mlv.fr> wrote:
> 
> Hi Stuart,
> you are not the first one to try to change the integers defined in org.objectweb.asm.Opcodes, those values are compared by ref (not by value) inside ASM.
> You're patch will change the behavior of any Interpreters that also use some Integers created by Integer.valueOf() because valueOf may cache the Integer references. 
> 
> I will add a comment in the ASM trunk for avoid such refactoring in the future.
> 
> reagrds,
> Rémi
> 
> 
> ----- Mail original -----
>> De: "Stuart Marks" <stuart.marks at oracle.com>
>> À: "core-libs-dev" <core-libs-dev at openjdk.java.net>
>> Envoyé: Jeudi 14 Avril 2016 03:50:14
>> Objet: RFR(m): 8145468 deprecations for java.lang
>> 
>> Hi all,
>> 
>> Please review this first round of deprecation changes for the java.lang
>> package.
>> This changeset includes the following:
>> 
>>  - a set of APIs being newly deprecated
>>  - a set of already-deprecated APIs that are "upgraded" to forRemoval=true
>>  - addition of the "since" element to all deprecations
>>  - cleanup of some of the warnings caused by new deprecations
>> 
>> Webrevs:
>> 
>>   http://cr.openjdk.java.net/~smarks/reviews/8145468/webrev.0.jdk/
>> 
>>   http://cr.openjdk.java.net/~smarks/reviews/8145468/webrev.0.langtools/
>> 
>>   http://cr.openjdk.java.net/~smarks/reviews/8145468/webrev.0.top/
>> 
>> The newly deprecated APIs include all of the constructors for the boxed
>> primitives. We don't intend to remove these yet, so they don't declare a
>> value
>> for the forRemoval element, implying the default value of false. The
>> constructors being deprecated are as follows:
>> 
>>   Boolean(boolean)
>>   Boolean(String)
>>   Byte(byte)
>>   Byte(String)
>>   Character(char)
>>   Double(double)
>>   Double(String)
>>   Float(float)
>>   Float(double)
>>   Float(String)
>>   Integer(int)
>>   Integer(String)
>>   Long(long)
>>   Long(String)
>>   Short(short)
>>   Short(String)
>> 
>> The methods being deprecated with forRemoval=true are listed below. All of
>> these
>> methods have already been deprecated. They are all ill-defined, or they don't
>> work, or they don't do anything useful.
>> 
>>   Runtime.getLocalizedInputStream(InputStream)
>>   Runtime.getLocalizedOutputStream(OutputStream)
>>   Runtime.runFinalizersOnExit(boolean)
>>   SecurityManager.checkAwtEventQueueAccess()
>>   SecurityManager.checkMemberAccess(Class<?>, int)
>>   SecurityManager.checkSystemClipboardAccess()
>>   SecurityManager.checkTopLevelWindow(Object)
>>   System.runFinalizersOnExit(boolean)
>>   Thread.countStackFrames()
>>   Thread.destroy()
>>   Thread.stop(Throwable)
>> 
>> Most of the files in the changeset are cleanups. Some of them are simply the
>> addition of the "since" element to the @Deprecated annotation, to indicate
>> the
>> version in which the API became deprecated.
>> 
>> The rest of the changes are cleanup of warnings that were created by the
>> deprecation of the boxed primitive constructors. There are a total of a
>> couple
>> hundred such uses sprinkled around the JDK. I've taken care of a portion of
>> them, with the exception of the java.desktop module, which alone has over 100
>> uses of boxed primitive constructors. I've disabled deprecation warnings for
>> the
>> java.desktop module for the time being; these uses can be cleaned up later.
>> I've
>> filed JDK-8154213 to cover this cleanup task.
>> 
>> For the warnings cleanups I did, I mostly did conversions of the form:
>> 
>>    new Double(dval)
>> 
>> to
>> 
>>    Double.valueOf(dval)
>> 
>> This is a very safe transformation. It changes the behavior only in the cases
>> where the code relies on getting a new instance of the box object instead of
>> one
>> that might come out of a cache. I didn't see any such code (and I should hope
>> there's no such code in the JDK!).
>> 
>> I applied autoboxing only sparingly, in the cases where it was an obviously
>> safe
>> thing to do, or where nearby code already uses autoboxing. Autoboxing
>> actually
>> generates a call to the appropriate valueOf() method, so the bytecode would
>> be
>> the same in most cases. The only difference is clutter in the source code. On
>> the other hand, there's some risk in converting to autoboxing, as the
>> implicitly
>> autoboxed type might end up different from an explicit call to valueOf().
>> This
>> isn't always obvious, so that's why I mostly avoided autoboxing.
>> 
>> Thanks,
>> 
>> s'marks
>> 
>> 




More information about the core-libs-dev mailing list