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.
¿Hay una razón teórica o técnica para la restricción de elementos válidos?
¿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).