type retentionpolicy notacion crear anotación annotation java eclipse intellij-idea nullpointerexception annotations

retentionpolicy - Qué anotación Java @NonNull usar



java lang annotation (1)

¿Cuál es la mejor anotación ''no nula''?

"Mejor" en el sentido de

  • Forma estándar, por ejemplo, pruebas futuras (por ejemplo, soporte de jdk estándar, etc.)
  • Soporte de IDE (aparece en java doc para indicar el uso para desarrolladores)
  • Soporte por herramientas de análisis estático como findbugs
  • Soporte para análisis de tiempo de ejecución

Así es como se ve actualmente el mundo: se aprecia cualquier otra información:

  • javax.validation.constraints.NotNull ( Docs )
    El paquete + javax parece estar preparado para el futuro
    - Parte de JEE no JSE. En JSE necesita importar libs adicionales .
    - No compatible con herramientas de análisis estático (solo validación de tiempo de ejecución)

  • edu.umd.cs.findbugs.annotations.NonNull ( docs )
    - biblioteca externa y no un paquete javax
    - en docs desde findbugs versión 3.X
    + utilizado para análisis estático (por findbugs y, por lo tanto, Sonar)

  • javax.annotation.Nonnull ( docs )
    + utilizado para análisis estático (en findbugs)
    - JSR-305 está inactivo / muerto / desconocido como en la lista de correo de fb indicada. El autor Bill Pugh, incluso si se le pregunta directamente, no ha comentado el estado en años ...

  • org.eclipse.jdt.annotation_2.0.0 ( docs , presentation interesante)
    + usado para análisis estático (aunque en eclipse no en findbugs)
    - patentado para eclipsar (no intenté usarlos de forma independiente)

  • org.jetbrains.annotations.NotNull ( docs )
    + utilizado para análisis estático (en intelliJ no en findbugs)
    - propiedad de IntelliJ (pero también disponible públicamente como jar)

  • lombok.NonNull ( docs )
    + utilizado para controlar la generación de código
    - anotación de propiedad

  • android.support.annotation.NonNull ( docs )
    + análisis estático en android studio
    - Anotación propietaria específica de Android

  • org.checkerframework.checker.nullness.qual.NonNull ( docs )
    + Implementación JSR308 que es parte de Java8 (que introdujo la capacidad de escribir anotaciones en diferentes partes de su código, pero no introdujo nuevas anotaciones)
    + utilizado para código estático (no para encontrar errores) y análisis de tiempo de ejecución
    - la biblioteca externa, sin embargo, parece estar endorsed por la gente de Java

Actualmente, me inclino por el Checker Framework, pero espero otras vistas ...

[descargo de responsabilidad] Sé que la pregunta se ha hecho aquí, sin embargo no fue respondida (o la respuesta fue incorrecta / incompleta / desactualizada) [/ descargo de responsabilidad]


No hay una anotación estándar @NonNull . Crear tal anotación era el objetivo de JSR 305, que ha sido abandonado durante mucho tiempo. No habrá una anotación estándar @NonNull hasta que se reconstituya JSR 305. Oracle no tiene planes actuales para hacerlo. (Las anotaciones JEE están fuera del alcance de JSR 305.)

Para futuras pruebas, el factor más importante a considerar es si la anotación es una anotación de tipo o una anotación de declaración. Debido a que @NonNull establece una propiedad del valor de la variable en lugar de la variable en sí misma, debería ser una anotación de tipo. Ser una anotación de tipo también permite que la anotación se escriba en más ubicaciones, como en List<@NonNull String> .

Puede determinar si una anotación es una anotación de tipo mirando la @Target en la definición de la anotación. Al escribir estas líneas, parece que solo las versiones de Checker Framework y Eclipse son anotaciones de tipo, por lo que las elegiría entre las que son anotaciones de declaración. Tenga en cuenta que los desarrolladores de cualquiera de las otras anotaciones también podrían actualizarlas para que sean anotaciones de tipo; No sé de sus planes.

El único inconveniente es que el uso de una anotación de tipo requiere el uso de un compilador Java 8. Checker Framework tiene mecanismos para permitir que un compilador de Java 7 compile el código que contiene sus anotaciones.