2011-01-07 35 views
5

Nunca encontré el caso y ahora me pregunto: ¿qué sucede cuando/si dos anotaciones diferentes tienen el mismo nombre? (Voy a dar aquí un ejemplo utilizando una anotación proporcionada por IntelliJ pero la pregunta es muy genérica, así que no estoy etiquetarlo 'IntelliJ')¿Qué sucede cuando dos anotaciones diferentes tienen el mismo nombre?

Por ejemplo, la primera frase aquí:

http://youtrack.jetbrains.net/issue/IDEABKL-4959

dice:

Muchas bibliotecas tienen sus propios @NotNull anotaciones (intellij, de hibernación de validación, ..).

exactamente lo que sucede si quería utilizar, por ejemplo, tanto de @NotNull IntelliJ e Hibernate de @NotNull? (una vez más, @NotNull es solo un ejemplo en el que encuentro un choque)

¿Son incompatibles? Si son incompatibles, ¿es para todo el proyecto?

Esto es algo que realmente no estoy familiarizado con ...

Respuesta

8

No hay ninguna ambigüedad, ya que el nombre del paquete de la anotación se especificará en una importación o en la propia anotación.

JSR-305 aborda su ejemplo específico. Busca un conjunto estándar de anotaciones y se refiere específicamente a las anotaciones de anulabilidad FindBugs e IntelliJ.

Anulaciones de nulidad (por ejemplo, @NonNull y @CheckForNull). Ambos FindBugs y IntelliJ ya son compatibles con sus propias versiones de anulaciones de nulidad.

6

En tal caso, es necesario especificar el nombre calificado completo, por ejemplo

@bar.baz.Foo 
@org.fubar.Foo 
void myMethod() {...} 
2

Lo hacen no como el paquete completo es parte del nombre. El efecto es que solo puede importar uno y tendrá que referirse a cualquier otro con su nombre completo. Al igual que

@NotNull 
@com.jetbrains.annotations.NotNull 
public Object ... 
+0

+1 ... Ouch. Seguro que se ve feo/detallado usando el nombre completo: - / – Gugussee

1

Eso no importará ya que el nombre completo de cada anotación no será el mismo. Puede declarar el nombre calificado en la sección import.

0

El problema es el mismo para dos clases/interafces/enums/anotaciones con el mismo nombre. Deben aparecer en diferentes paquetes. Si están en el mismo paquete (por ejemplo, diferentes versiones) pero diferentes jar/directories, entonces se elige el primero encontrado en classpath.

Cuestiones relacionadas