tipos programacion primitivos objeto ejemplos definicion declarar datos java annotations element

programacion - ¿Por qué no se pueden anotar todas las declaraciones en Java?



tipos de datos primitivos en programacion (4)

Me encontré con un problema simple ingenuamente tratando de hacer esto:

public void someMethod(){ int x = 0; ... @SuppressWarnings({"rawtypes", "unchecked"}) x = ((Comparable)lhs).compareTo(rhs); ... }

Esto es ilegal y tiene que reformularse para compilar:

public void someMethod(){ ... @SuppressWarnings({"rawtypes", "unchecked"}) int x = ((Comparable)lhs).compareTo(rhs); ... }

He rastreado el problema hasta ElementType : una declaración no parece ser un elemento de programa válido. Esto es bastante confuso: pensé que una declaración es algo así como un supertipo de todos los elementos de programación.

  1. ¿Hay una razón teórica o técnica para la restricción de elementos válidos?

  2. ¿Podría hacerse de otra manera, es decir, suponiendo que podría reemplazar a ElementType con mi propia clase y dominar los cambios ondulantes, podría anotar cualquier afirmación?


Sé que una respuesta ya ha sido aceptada, simplemente lanzando esto. Aquí hay un extracto de las preguntas frecuentes para JSR-175 que originalmente agregó anotaciones a Java:

¿Por qué no puedes anotar elementos de programa arbitrarios como bloques y declaraciones individuales?

Esto complicaría mucho la sintaxis de la anotación: tendríamos que sacrificar la simplicidad de decir que las anotaciones son simplemente modificadores, que se pueden usar en las declaraciones.

En otras palabras, porque es demasiado trabajo :-)


Si miras el Javadoc para @SuppressWarnings , verás la respuesta: sus objetivos declarados son

@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})

En otras palabras, no se puede aplicar legalmente a una declaración. Sin embargo, se puede aplicar a una declaración de variable. No tiene nada que ver con si una declaración es un elemento de programa; es básicamente porque esta anotación se aplica solo a declaraciones de cosas.

Además, si observa el Javadoc para la enumeración que describe las cosas que pueden tener anotaciones, las declaraciones y las expresiones no se encuentran entre las opciones. En general, las anotaciones se pueden aplicar a declaraciones de cosas, no a bits de código.

La razón teórica para esto es que las anotaciones se almacenan como propiedades de elementos individuales declarados en el archivo de clase. Las declaraciones no califican; cuando se compila su código, las declaraciones han dejado de existir. Solo hay una secuencia de código de bytes, y el único recordatorio de los enunciados de los que procede son las tablas de números de línea (opcionales). Para hacer frente a esto, tendrían que agregar un nuevo atributo al archivo de clase para hacer referencia a los códigos de byte individuales, como en esta propuesta, y tratar con una serie de complejidades que surgen como resultado.


Una declaración en Java es una entidad que tiene un identificador y puede ser referenciada desde otras partes del programa. Una declaración no cumple con ese criterio; es una acción que posiblemente resulte en un valor asignado a alguna entidad declarada.

La sección 6.1 de las especificaciones de Java ( http://docs.oracle.com/javase/specs/jls/se5.0/html/names.html#6.1 ) enumera los tipos de declaraciones, que se alinean con los valores de enumeración de ElementType .


Se ha propuesto como parte de JSR-308 permitir anotaciones en las declaraciones, pero actualmente no es compatible y no formará parte de la próxima versión del lenguaje Java (es decir, Java 8).

Supongo que en el momento en que se agregaron anotaciones al lenguaje, la clase objetivo principal y la información de nivel de método elaborada principalmente en casos de uso de tiempo de ejecución (por ejemplo, Java EE, JPA, JAX-WS, etc.), mientras que las anotaciones de nivel de declaración son principalmente útil en tiempo de compilación (ver el enlace anterior a la wiki para la lista de casos de uso).