@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?
- Diferencia entre MainThread, UiThread, WorkerThread, BinderThread en Android Annotation
- Usando Butter Knife en Custom BaseAdapter SubClass Resultados en el error "Unable to inject views"
- Anotaciones perdidas.jar
- ¿Cómo utilizar las anotaciones de Java para guiar Proguard de Android?
- Anotación Los procesadores generaron recursos no empaquetados a APK
- @ Interfaz - ¿Qué?
- Java - ¿Utilizar anotaciones e interceptar métodos?
- Procesamiento de anotaciones multi-módulo en Android Studio
- ¿Cuál es la diferencia entre @UiThread y @MainThread anotación en Android?
- Dile a Proguard que mantenga la anotación en los métodos
- ¿Cómo serializar usando gson con @SerializedName anotación?
- Bind array de cuerdas en el butterknife
- ¿Cómo desactivo las verificaciones de anotaciones de Android @IntDef en casos especiales?
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 .)
- Texto de estilo del parámetro en método getString (int resId, Object … formatArgs)
- ¿Dónde encuentro el espacio de nombres de una aplicación