Sono confuso sull'uso corretto di queste annotazioni.Quali sono gli usi corretti di @NonNull e @Nullable?
android.support.annotation.NonNull;
android.support.annotation.Nullable;
Le informazioni contenute nella documentazione per @NonNull
dice:
Indica che un parametro, il campo o il valore di ritorno del metodo non può mai essere nullo.
Cosa significa nel caso di parametri, quando non c'è nulla che impedisca di passare null
?
Ad esempio, supponiamo di avere una classe MyObject
e che un'istanza possa o meno avere un titolo.
public final class MyObject {
private String title = null;
public void setTitle(String title) {
if (title == null)
throw new NullPointerException();
this.title = title;
}
public void clearTitle() {
title = null;
}
}
Qui sto usando null
per rappresentare l'assenza di un titolo, ma questo è un dettaglio di implementazione, quindi non vorrebbe un unico metodo di fissazione e di compensazione il titolo.
Se io marco il campo title
come @Nullable
, Android Studio mi dice che il parametro da setTitle
dovrebbe probabilmente essere contrassegnato @Nullable
troppo (ma questo è il contrario di quello che voglio).
Se io marco il parametro al metodo setTitle
come @NonNull
Ho ricevuto un avviso che la condizione è sempre title == null
false
.
Qual è l'uso corretto di queste annotazioni in un caso come questo? Se @NonNull
significa che un parametro può essere non è mai null
è errato utilizzarlo per indicare non deve essere null
? Se sì, c'è un modo corretto per indicarlo?
In generale, i controlli sono ancora necessari. Le annotazioni aiutano l'IDE a comprendere il contratto. Alcuni IDE vanno oltre e generano errori di runtime, anche se il controllo di runtime da parte dell'IDE è una cortesia, non un requisito. –