sirve - ¿Cómo fuerzo una subclase Java para definir una Anotación?
super en java (3)
Si una clase definió una anotación, ¿es de alguna manera posible forzar a su subclase a definir la misma anotación?
Por ejemplo, tenemos un par simple clase / subclase que comparte la @Author @interface.
Lo que me gustaría hacer es forzar a cada subclase adicional a definir la misma anotación @Author
, evitando una RuntimeException
algún momento del camino.
TestClass.java:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface Author { String name(); }
@Author( name = "foo" )
public abstract class TestClass
{
public static String getInfo( Class<? extends TestClass> c )
{
return c.getAnnotation( Author.class ).name();
}
public static void main( String[] args )
{
System.out.println( "The test class was written by "
+ getInfo( TestClass.class ) );
System.out.println( "The test subclass was written by "
+ getInfo( TestSubClass.class ) );
}
}
TestSubClass.java:
@Author( name = "bar" )
public abstract class TestSubClass extends TestClass {}
Sé que puedo enumerar todas las anotaciones en tiempo de ejecución y verificar si falta @Author
, pero me gustaría hacer esto en tiempo de compilación, si es posible.
Estoy bastante seguro de que esto es imposible de hacer en tiempo de compilación.
Sin embargo, esta es una tarea obvia para una prueba de "unidad". Si tiene convenciones como esta que le gustaría hacer cumplir, pero que pueden ser difíciles o imposibles de verificar con el compilador, las pruebas de "unidad" son una forma sencilla de verificarlas.
Otra posibilidad es implementar una regla personalizada en un analizador estático. Aquí también hay muchas opciones.
(Puse la unidad en comillas espantadas, ya que esto es realmente una prueba de convenciones, en lugar de una unidad específica. Pero debe funcionar junto con las pruebas de la unidad).
Puede hacer una anotación (por ejemplo, @EnforceAuthor) con @Inherited en la superclase y usar las anotaciones del compilador (desde Java 1.6) para ponerse al día en tiempo de compilación. Luego tiene una referencia a la subclase y puede verificar si falta otra Anotación (ej. @Author). Esto permitiría cancelar la compilación con un mensaje de error.
Puede hacerlo con JSR 269, en tiempo de compilación. Ver: http://today.java.net/pub/a/today/2006/06/29/validate-java-ee-annotations-with-annotation-processors.html#pluggable-annotation-processing-api