Code review request for 6908218 "java.lang.Deprecated should have explicit @Target meta-annotation"
Joseph D. Darcy
Joe.Darcy at Sun.COM
Thu Jan 14 17:57:59 UTC 2010
Bruce Chapman wrote:
> Joe,
>
> there is information about the rationale for the change in this email
> but that information isn't in the bug report, Will it be put in the
> commit message or bug report?
Hi Bruce.
I'll at least add a link to the core-libs thread to the bug when I
update the bug to fixed state.
-Joe
>
> Bruce
>
>
> Joseph D. Darcy wrote:
>> Hello.
>>
>> Please review my patch to fix 6908218 "java.lang.Deprecated should
>> have explicit @Target meta-annotation."
>>
>> For background, JSR 308 added two new enum constants to ElementType.
>> ElementType constants are used in java.lang.annotation.Target
>> meta-annotations to indicate what kind of elements an annotation is
>> applicable to.
>>
>> If an annotation type does not have a @Target meta-annotation,
>> annotations of the annotation type are allowed to be applied to all
>> elements. Therefore, after JSR 308 added new ElementTypes,
>> annotations without @Target meta-annotations can now be applied to
>> more kinds of things, perhaps inappropriately given the semantics of
>> the annotation.
>>
>> Conversely, annotations that do have a @Target meta-annotations might
>> want to be applicable to the new locations.
>>
>> Two adjustments should be done to platform annotations: @Deprecated
>> should get an explicit @Target meta-annotation and @SuppressWarnings
>> should be applicable to another ElementType:
>>
>> --- old/src/share/classes/java/lang/Deprecated.java 2010-01-13
>> 22:30:49.000000000 -0800
>> +++ new/src/share/classes/java/lang/Deprecated.java 2010-01-13
>> 22:30:49.000000000 -0800
>> @@ -26,6 +26,7 @@
>> package java.lang;
>>
>> import java.lang.annotation.*;
>> +import static java.lang.annotation.ElementType.*;
>>
>> /**
>> * A program element annotated @Deprecated is one that programmers
>> @@ -38,5 +39,6 @@
>> */
>> @Documented
>> @Retention(RetentionPolicy.RUNTIME)
>> + at Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE,
>> PARAMETER, TYPE})
>> public @interface Deprecated {
>> }
>> --- old/src/share/classes/java/lang/SuppressWarnings.java
>> 2010-01-13 22:30:50.000000000 -0800
>> +++ new/src/share/classes/java/lang/SuppressWarnings.java
>> 2010-01-13 22:30:49.000000000 -0800
>> @@ -26,7 +26,6 @@
>> package java.lang;
>>
>> import java.lang.annotation.*;
>> -import java.lang.annotation.ElementType;
>> import static java.lang.annotation.ElementType.*;
>>
>> /**
>> @@ -45,7 +44,7 @@
>> * @since 1.5
>> * @author Josh Bloch
>> */
>> - at Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
>> + at Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR,
>> LOCAL_VARIABLE, TYPE_PARAMETER})
>> @Retention(RetentionPolicy.SOURCE)
>> public @interface SuppressWarnings {
>> /**
>>
>>
>> For java.lang.Deprecated, the meta-annotation
>> @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE,
>> PARAMETER, TYPE})
>> includes all JDK 5/6 era locations annotations can be applied to.
>> Therefore, with this list the locations @Deprecated can be applied
>> will be unchanged from Java SE 6.
>>
>> JLSv3 mandates warnings be issued for the use of a deprecated "type,
>> method, field, or constructor"
>> (http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.6).
>> Other permitted applications of an @Deprecated annotation must be
>> ignored; "Use of the annotation @Deprecated on a local variable
>> declaration or on a parameter declaration has no effect." Therefore,
>> allowing @Deprecated on TYPE_PARAMETER or as a TYPE_USE would not be
>> meaningful.
>>
>> Webrev at:
>> http://cr.openjdk.java.net/~darcy/6908218.0/
>>
>> Thanks,
>>
>> -Joe
>>
>
More information about the core-libs-dev
mailing list