2011-09-03 17 views
7

He estado usando anotaciones en Java o durante un tiempo como usuario final, pero recientemente decidí buscar la creación de mis propios tipos de anotaciones y encuentro que la sintaxis para definir anotaciones en Java con @interface es muy extraña. Mi pregunta es por qué Java usa @interface para definir anotaciones en lugar de introducir una nueva palabra clave como lo hicieron para las enumeraciones. ¿Hay alguna ventaja de la sintaxis de la interfaz @ que me falta?¿Por qué se usa @interface para definir anotaciones?

Me apetece comprender las consideraciones de diseño que atravesaron los diseñadores de anotaciones Estoy seguro de que deben haber jugado con la idea de introducir una nueva palabra clave para definir las anotaciones.

@interface tiene demasiadas restricciones, por ejemplo, no se puede usar extender, existen tipos específicos que no se pueden usar al definir un miembro de anotación, como Fecha. Encuentro que las restricciones sobre lo que puede entrar en @interface no son obvias y me parece un truco.

Respuesta

0

Está claro que los diseñadores no quisieron agregar una palabra clave. No es algo que se haga a la ligera, ya que invalida los programas correctos existentes. El comité Cobol-9x agregó docenas o cientos de palabras clave y debería haber escuchado los gritos. Algunas compañías estaban hablando de demandar al organismo de normas.

+0

¿Puede explicar lo que quiere decir @ no es una palabra clave que el compilador trata de una manera especial mientras que la especificación dice que puede definir el tipo de anotación con algo como "@ interface" con espacios entre la interfaz @ para mí se siente como una palabra clave ver mi pregunta actualizada en cuanto a "por qué no" no es la única respuesta disponible – ams

+0

@ams mis disculpas, revisé la gramática de Java, de hecho es una palabra clave, así que he revisado por completo mi respuesta. – EJP

5

no sé las consideraciones exactas para este caso en particular, pero en general:

La introducción de una nueva palabra clave en un rompe la compatibilidad de idiomas de todo el código fuente existente que pasa a utilizar esa palabra clave en particular como un identificador.

El código fuente existente no se puede compilar con la nueva versión del compilador hasta que se haya cambiado para evitar la palabra clave. Esto no es imposible de superar (como lo demostró el caso enum), pero es incómodo y obliga a mucha gente a hacer un trabajo extra. Los diseñadores de Java generalmente han intentado introducir nuevas funciones de idioma sin romper la compatibilidad del código fuente.

En el caso de enum, que usted mencionó, supongo que decidieron que es (a) una palabra clave común en otros lenguajes de estilo C, (b) generalmente se usa solo como un identificador de alcance local en el código existente y por lo tanto fácilmente refactorizado y (c) sin alternativas sanas. Decidieron que los beneficios superaban los costos. Para el caso de anotación, aparentemente decidieron lo contrario.

Como un aparte, puede que esté interesado en ver Josh Bloch's Effective API Design talk que se refiere a muchas de estas consideraciones.

1

Las declaraciones de anotaciones son, por lo general, muy desagradables de observar.

Probablemente pensaron que, solo unos pocos (expertos) declararán y procesarán anotaciones, la mayoría de los programadores simplemente usarán anotaciones diseñadas por expertos. Por lo tanto, no pensaron demasiado para embellecer las declaraciones de anotación. enum se supone que es utilizado por la mayoría de los programadores en su trabajo diario, por lo que la sintaxis debe ser sucinta.

Pero ahora más y más frameworks como Guice/CDI requieren/animan a los programadores de aplicaciones a declarar sus propias anotaciones. Y muchos programadores se sienten lo suficientemente valientes como para diseñar y procesar sus propias anotaciones. El problema de la sintaxis desordenada de las declaraciones de anotación se vuelve más prominente.

+0

JSR 303 Bean Validation acordado requiere que los desarrolladores definan sus propias anotaciones si desea hacer anotaciones de validador compuestas dada la importancia de la validación para crear aplicaciones Creo que el comentario que he visto en las especificaciones Sun que la mayoría de los desarrolladores solo necesitarán usar, pero no definir anotaciones para ser corto de miras – ams