[JSR308] Strawman proposal for repeated annotations

Joseph D. Darcy Joe.Darcy at Sun.COM
Fri Nov 16 14:28:40 EST 2007


Hello.

One of the design choices of annotations as introduced in JSR 175 is 
that repeated annotations are not allowed; that is, there can be at most 
one application of a particular annotation to a given element.

Various Java EE users of annotations wanted the ability of have multiple 
annotations; the workaround using JSR 175 is to have a second container 
annotation with an array-valued member, something like

@interface MyAnnotation {
    int value();
}

@interface MyRepeatedAnnotationContainer {
    MyAnnotation [] value();
}

Addressing this limitation is one of the items included in this JSR's 
scope.  Below is my strawman proposal to alleviate this issue.

The proposal is to support syntactic sugar for the existing pattern 
along with enhanced API support for retrieving the repeated values.  The 
assumption of at most one value per annotation type is throughly baked 
into the annotations design and the design of the APIs reading 
annotations.  It is impractical to change that decision now; attempting 
to do so would expose the numerous corner cases and interactions the JSR 
175 design avoided.

First, a new meta-annotation is introduced to allow an annotation type 
to declare what its containing type should be:

@interface Container {
  Class<? extends Annotation> value();
}

so that the declaration

@Container(MyRepeatedAnnotationContainer.class)
@interface MyAnnotation()

would allow something like

@MyAnnotatio(1) @MyAnnotation(2) @MyAnnotation(3)
public class Foo();

to be treated as

@MyRepeatedAnnotationContainer(
  {@MyAnnotation(1),
   @MyAnnotation(2),
   @MyAnnotation(3)})
public class Foo();

(I'm not sure what the exact syntactic sugar should be; it might be 
beneficial to wrap the repeated annotations in "@{", "}" to emphasize 
the grouping or to restrict the repeated annotations to be sequentially 
applied.)

Declaring the container in the annotation type provides the compiler and 
the runtime the information needed to construct or lookup the containing 
type.  There could be a new method on AnnotatedElement like

<T extends Annotation> T[] getRepeatedAnnotation(Class<T> annotationClass)

or

<T extends Annotation> List<T> getRepeatedAnnotation(Class<T> 
annotationClass)

This method could potentially handle some of the tricky cases like 
returning the non-contained annotation if there is one, otherwise return 
the contained annotation, etc.

The intention is to allow the @Container meta-annotation to be 
retrofitted to existing wrapper annotations.

Comments?

-Joe




More information about the JSR308 mailing list