More precise annotation targets

Brian Goetz brian.goetz at oracle.com
Thu Oct 11 16:01:15 UTC 2018


No.  This is quite rightly the domain of extralinguistic tools, not the 
language.

Think about it this way: this feature would be interesting to very few 
people, and it would affect those few people in only a small way.  The 
bar is just way higher than that. This is a project-specific concern, 
not a world-wide concern.




On 10/11/2018 9:40 AM, arjan tijms wrote:
> Hi Brian,
>
> You're right. It can be done today that way.
>
> Do you think though it would be an option to consider for a language 
> change, given that when being a language feature it would have much 
> better support from IDEs and other tools?
>
> Kind regards,
> Arjan Tijms
>
>
>
>
>
> On Thu, Oct 11, 2018 at 2:27 PM Brian Goetz <brian.goetz at oracle.com 
> <mailto:brian.goetz at oracle.com>> wrote:
>
>     You can accomplish this today with an annotation processor. Make your
>     own @TargetMethods meta-annotations, and then have an AP that
>     enforces
>     that the constraints of the meta-annotations are respected. You don't
>     need a language change.
>
>
>
>
>
>     On 10/11/2018 9:18 AM, arjan tijms wrote:
>     > Hi,
>     >
>     > I wonder if the following would make sense to consider for a
>     Java language
>     > enhancement:
>     >
>     > Annotations can currently be targeted
>     > to TYPE, FIELD, METHOD, TYPE_PARAMETER etc.
>     >
>     > For lots of cases this is fine, but in other case you need a bit
>     more
>     > detail. For instance, consider an @ActionEvent annotation that
>     targets
>     > METHOD, but actually can only be applied on methods with a specific
>     > signature such as void method(Action); and void method();
>     >
>     > You might want to have correct placement of the annotation
>     expressed in a
>     > little more exact way, like e.g.
>     >
>     > @Target(METHOD)
>     > @TargetMethods( {ActionInterface.class, ActionInterface2.class})
>     > @Retention(RUNTIME)
>     > public @interface ActionEvent {}
>     >
>     >
>     > With ActionInterface.class and ActionInterface2.class both
>     functional
>     > classes.
>     >
>     > Alternatively:
>     >
>     > @Target(METHOD)
>     > @TargetMethods( {
>     >      @MethodSignature(
>     >          return=Void.class, arguments=Action.class),
>     >       @MethodSignature(
>     >          return=Void.class)}
>     > }
>     > @Retention(RUNTIME)
>     > public @interface ActionEvent {}
>     >
>     > The syntax used is just illustrative of the idea.
>     >
>     > Thoughts?
>     >
>     > Kind regards,
>     > Arjan
>



More information about the discuss mailing list