@NonNull y anotaciones @Nullable – ¿Afecta el rendimiento en Android?

¿ Las anotaciones @NonNull y @Nullable afectan el rendimiento en Android durante el tiempo de ejecución? Quiero decir que sólo tienen el propósito de apoyar LINT y otras herramientas para detectar posibles errores, por lo que probablemente / esperemos que se ignorará durante la compilación. ¿Tienes alguna fuente para demostrar esto?

Como pequeño experimento creé el siguiente método en una aplicación de Android:

private void test(@NonNull Object o) { o.toString(); } 

Compiló el proyecto, 'un-compilado' con ApkTool y echó un vistazo al archivo smali :

 .method private test(Ljava/lang/Object;)V .locals 0 .param p1, "o" # Ljava/lang/Object; .annotation build Landroid/support/annotation/NonNull; .end annotation .end param .prologue .line 22 invoke-virtual {p1}, Ljava/lang/Object;->toString()Ljava/lang/String; .line 23 return-void .end method 

Por lo tanto, la anotación Nonnull no se elimina del código en tiempo de compilación.

Aunque podría desactivar las comprobaciones en el estudio de Android, llamar al método de prueba con null como un argumento y compilar la aplicación. A continuación, se bloquea con un NullPointerExeption en o.toString() por supuesto, pero no hay ninguna pista de la VM en realidad utilizando la anotación para comprobar el parámetro en tiempo de ejecución. Exactamente lo que laalto dijo en su respuesta.

Me pregunto si la VM sería capaz de hacerlo y lanzar una excepción cuando el método se llama con el argumento null .

Las anotaciones @NonNull y Nullable se declaran con la directiva de retención CLASS . Se ven en el bytecode compilado pero pueden ser ignorados por la VM en tiempo de ejecución.

Si te preocupa el rendimiento, ejecuta un experimento para ver si es un problema para ti. Yo hipotetizaría que las anotaciones de retención de clase no agregan ninguna sobrecarga significativa.

(Si la directiva de retención fue runtime y las anotaciones fueron consultadas a través de la reflexión en tiempo de ejecución, entonces habrá problemas de rendimiento especialmente en el pasado .)

  • Anotaciones de JPA en Android
  • El procesamiento de anotaciones de Kotlin ignora los elementos con nombres similares
  • Referencia no resuelta: Kotlin necesita 2 compilaciones después de limpiar para recoger código al usar kapt
  • ObtenidoStyledAttributes anotado con @StyleableRes. Suprimir advertencias
  • Uso de AndroidAnnotations con Scala y Gradle
  • ¿Puedo procesar anotaciones jaxb en tiempo de compilación?
  • No obtener fuentes procesadas (generadas) de anotación compiladas en apk, usando maven
  • Anotaciones de importación dando error en limpio
  • Forma correcta de usar la anotación @NonNull en Android Studio
  • ¿Es posible generar una clase interna de una clase para compilar con un procesador de anotación?
  • Anotación / decorador personalizado de Java @Testing
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.