2015-09-18 13 views
18

Vorrei utilizzare l'annotazione @NonNull in Android, ma non riesco a capire il modo giusto per farlo. vi propongo questo esempio:Modo giusto per utilizzare l'annotazione @NonNull in Android Studio

public void doStuff(@NonNull String s){ 
    //do work with s...  
} 

Così quando chiamo doStuff(null) l'IDE mi darà un avvertimento. Il problema è che non posso fare affidamento su questa annotazione poiché, come la domanda this, non si propagano molto lontano. Così mi piacerebbe mettere un controllo nulla sul mio metodo, in questo modo:

if(s==null) throw new IllegalAgrumentException(); 

Ma l'IDE, partendo dal presupposto che s!=null, mi avvertono che s==null è sempre false. Mi piacerebbe sapere qual è il modo migliore per farlo.

Personalmente ritengo che ci dovrebbe essere un'annotazione come @ShouldntBeNull che solo controlli e avverte che non è passato nulla ad esso, ma non lo fa lamenta quando il valore è nullo selezionata.

+1

"Mi piacerebbe sapere qual è il modo migliore per farlo" - ci dovrebbe essere una soluzione rapida nell'IDE per sopprimere questo avviso. "Personalmente penso ..." - puoi [presentare una richiesta di funzionalità] (https://code.google.com/p/android/issues/list), se lo desideri. – CommonsWare

+0

@CommonsWare Sembra che non ci sia una rapida correzione 'SuppressWarning' in Android Studio 1.3.2 – MMauro

+0

Bene, questo puzza. :-( – CommonsWare

risposta

5

È possibile utilizzare la soppressione commento stile di disabilitare quello specifico avvertimento controllo nullo, ad es .:

public MyMethod(@NonNull Context pContext) { 
     //noinspection ConstantConditions 
     if (pContext == null) { 
      throw new IllegalArgumentException(); 
     } 
     ... 
    } 

Avrete bisogno che //noinspection ConstantConditions ogni volta che lo fai.

9

È possibile utilizzare Objects.requireNonNull per quello. Si farà il controllo interno (in modo che l'IDE non mostrerà un avviso sul vostra funzione) e sollevare un NullPointerException quando il parametro è null:

public MyMethod(@NonNull Context pContext) { 
    Objects.requireNonNull(pContext); 
    ... 
} 

Se si vuole buttare un'altra eccezione o utilizzare livello di API < 19, allora puoi semplicemente creare la tua classe helper per implementare lo stesso controllo. per esempio.

public class Check { 
    public static <T> T requireNonNull(T obj) { 
     if (obj == null) 
      throw new IllegalArgumentException(); 
     return obj; 
    } 
} 

e usarlo in questo modo:

public MyMethod(@NonNull Context pContext) { 
    Check.requireNonNull(pContext); 
    ... 
} 
+0

forse anche [ questa risposta] (http://stackoverflow.com/a/41679666/6287240) è utile – TmTron

5

Google examples lo fanno nel modo seguente

import static com.google.common.base.Preconditions.checkNotNull; 

... 

public void doStuff(@NonNull String sParm){ 
    this.sParm= checkNotNull(s, "sParm cannot be null!"); 
} 
Problemi correlati