2012-06-11 13 views
7

me encontré con un tema sencillo, ingenuamente, tratando de hacer esto:¿Por qué no se pueden anotar todas las declaraciones en Java?

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

Esto es ilegal y tiene que ser reformulado para compilar:

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

me han 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. ¿Existe un motivo teórico o técnico para la restricción de los elementos válidos?

  2. Podría hacerse de otra manera, es decir, supongo que podría suplantar a ElementType con mi propia clase y dominar los cambios de ondulación, ¿podría anotar alguna afirmación?

+1

No está del todo claro lo que el contexto está aquí. No ayuda que no hayas especificado la anotación. Realmente, ¿qué estás tratando de hacer? –

+0

Lo que estaba tratando de hacer y lo que hice fue suprimir algunas advertencias del compilador. Lo que trato de hacer ahora es comprender la razón más profunda por la que no puedo anotar declaraciones aleatorias. No soy muy bueno en la teoría de los lenguajes de programación, pero esta restricción aparentemente arbitraria me intrigó – kostja

+0

Por lo tanto, muestre el * contexto completo *. ¿Estás tratando de hacer esto dentro de un método, o declarando una variable de instancia, etc.? –

Respuesta

11

Si nos fijamos en the Javadoc for @SuppressWarnings verá la respuesta: sus objetivos declarados son

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

En otras palabras, no se puede aplicar legalmente a un comunicado. 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 nos fijamos en the Javadoc for the enumeration that describes things that can have annotations, las declaraciones y expresiones no están 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 solo 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 this proposal, y tratar con una serie de complejidades que surgen como resultado.

+0

Gracias, Ernest. Estoy al tanto de la especificación. La pregunta ya tiene un enlace a ElementType. Quería saber, POR QUÉ se tomó la decisión de restringir las anotaciones a las declaraciones. – kostja

+0

aaah, ya veo. Tiene sentido. – kostja

+0

Como ex miembro del grupo de expertos JSR-308, tengo que votar esto por el último párrafo que contiene varias declaraciones inválidas y en gran parte las propias especulaciones del autor, especialmente en torno a la parte del "número de línea solamente". –

2

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 ElementType.

+0

Gracias, Alex. La segunda oración me deja un poco más claro: una declaración no puede ser rechazada. ¿Por qué las referencias son importantes aquí? La declaración tiene su lugar en el árbol de sintaxis y se puede alcanzar mediante cruce, por lo que se puede acceder de lo contrario ... – kostja

+0

@kostja No estoy seguro. Tal vez tiene algo que ver con el hecho de que las anotaciones se utilizan a menudo en tiempo de ejecución para obtener información sobre los elementos del programa a través de la reflexión. Hasta donde yo sé, no hay forma de usar la reflexión para acceder a las declaraciones en un programa. – Alex

3

has been proposed como parte de JSR-308 para 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 idioma, la clase objetivo principal y la información de nivel de método elaborada principalmente en casos de uso en tiempo de ejecución (por ejemplo, Java EE, JPA, JAX-WS, etc.), mientras las anotaciones de nivel son principalmente útiles en tiempo de compilación (consulte el enlace anterior al wiki para ver la lista de casos de uso).

+0

Gracias por las referencias, Eugene. Esperando el JSR-308, entonces :) – kostja

5

Sé que una respuesta ya ha sido aceptada, simplemente lanzando esto por ahí.He aquí un extracto de la FAQ para JSR-175 que originalmente añadió anotaciones de Java:

Por qué no puedes anotar los elementos del programa arbitrarias tales como bloques y declaraciones individuales?

Esto complicaría en gran medida 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 :-)

+0

Bonito, me hace reconsiderar la respuesta aceptada ya que esta de la boca del caballo. Gracias – kostja

Cuestiones relacionadas