java - nonnull - android support annotation nullable
Forma correcta de usar la anotaciĆ³n @NonNull en Android Studio (3)
Me gustaría usar la anotación @NonNull
en Android, pero no puedo encontrar la manera correcta de hacerlo. Te propongo este ejemplo:
public void doStuff(@NonNull String s){
//do work with s...
}
Entonces cuando llame a doStuff(null)
el IDE me dará una advertencia. El problema es que no puedo confiar en esta anotación ya que, como señala this pregunta, no se propagan muy lejos. Así que me gustaría poner un cheque nulo en mi método, como este:
if(s==null) throw new IllegalAgrumentException();
Pero el IDE, suponiendo que s!=null
, me advertirá que s==null
siempre es falso. Me gustaría saber cuál es la mejor manera de hacer esto.
Personalmente, creo que debería haber una anotación como @ShouldntBeNull
que solo comprueba y advierte que no se le pasa nulo, pero no se queja cuando se comprueba el valor.
Puede utilizar la supresión de estilo de comentario para deshabilitar esa advertencia específica de comprobación nula, por ejemplo:
public MyMethod(@NonNull Context pContext) {
//noinspection ConstantConditions
if (pContext == null) {
throw new IllegalArgumentException();
}
...
}
Necesitará que //noinspection ConstantConditions
cada vez que lo haga.
Puedes usar Objects.requireNonNull para eso. Hará la verificación internamente (por lo que el IDE no mostrará una advertencia en su función) y NullPointerException una NullPointerException cuando el parámetro sea null
:
public MyMethod(@NonNull Context pContext) {
Objects.requireNonNull(pContext);
...
}
Si desea lanzar otra excepción o usar el nivel de API <19, entonces puede crear su propia clase de ayuda para implementar la misma verificación. p.ej
public class Check {
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new IllegalArgumentException();
return obj;
}
}
y utilízalo así:
public MyMethod(@NonNull Context pContext) {
Check.requireNonNull(pContext);
...
}
Los ejemplos de Google lo hacen de la siguiente manera
import static com.google.common.base.Preconditions.checkNotNull;
...
public void doStuff(@NonNull String sParm){
this.sParm= checkNotNull(s, "sParm cannot be null!");
}