2008-09-18 18 views
11

Si una clase definió una anotación, ¿es de alguna manera posible forzar a su subclase a definir la misma anotación?¿Cómo fuerzo una subclase Java para definir una Anotación?

Por ejemplo, tenemos un simple par de clase/subclase que comparten el @Author @interface. Lo que me gustaría hacer es obligar a cada subclase más para definir el mismo @Author anotación, la prevención de una RuntimeException algún lugar 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 comprobar la falta @Author, pero realmente me gustaría hacer esto en tiempo de compilación, si es posible.

Respuesta

3

Estoy bastante seguro de que esto es imposible de hacer en tiempo de compilación.

Sin embargo, esta es una tarea obvia para una "unidad" de prueba. 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 entre comillas, ya que esto es realmente una prueba de convenciones, en lugar de una unidad específica. Pero debe funcionar junto con las pruebas unitarias).

2

Puede hacer una anotación (por ejemplo, @EnforceAuthor) con @Inherited en la superclase y usar 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 (por ejemplo, @Author). Esto permitiría cancelar la compilación con un mensaje de error.

Cuestiones relacionadas