25

Un tale caso sta leggendo un int da un pacchetto e la memorizzazione nella variabile limitato da @IndDef nota:Come disabilitare i controlli annotazione Android @IntDef in casi particolari?

public class MainActivity extends ActionBarActivity { 

@IntDef({STATE_IDLE, STATE_PLAYING, STATE_RECORDING}) 
@Retention(RetentionPolicy.SOURCE) 
public @interface State {} 

public static final int STATE_IDLE = 0; 
public static final int STATE_PLAYING = 1; 
public static final int STATE_RECORDING = 2; 

@MainActivity.State int fPlayerState = STATE_IDLE; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (savedInstanceState != null) 
     fPlayerState = savedInstanceState.getInt(BUNDLE_STATE); //Causes "Must be one of: ..." error 

ci deve essere un modo di sopprimere il controllo o la fusione da int @ MainActivity.State int per impostare la variabile nell'ultima riga.

L'altro caso è scrivere un test negativo che chiama una funzione con parametro annotato che passa intenzionalmente il parametro errato per verificare che l'eccezione sia lanciata in tal caso. Ci deve essere un modo per sopprimere il controllo delle annotazioni per compilare tale test.

risposta

50

Ho trovato il modo di sopprimere i controlli di annotazione. In realtà, ci sono tre di loro:

  1. Aggiungere @SuppressWarnings("ResourceType") prima della definizione della classe. Nel mio caso:

    @SuppressWarnings("ResourceType") 
    public class MainActivity extends ActionBarActivity { 
        ... 
    } 
    
  2. Aggiungere @SuppressWarnings("ResourceType") prima della definizione del metodo. Nel mio caso:

    @Override 
    @SuppressWarnings("ResourceType") 
    protected void onCreate(Bundle savedInstanceState) { 
        ... 
    } 
    

Questi due approcci non funzionano per me, perché voglio controlli di annotazione su tutto il mio codice, ad eccezione di una sola dichiarazione.

  1. Per sopprimere un controllo su una singola riga, aggiungere un commento appositamente formattato (!!!).

    //noinspection ResourceType 
    fState = savedInstanceState.getInt(BUNDLE_STATE); 
    
+1

Non sarebbe un tipo modo sicuro per ottenere un '@ IntDef' indietro di un fascio essere quello di fare un interruttore su di esso e assegnare il risultato finale sulla base dei valori? per esempio. "' state = getInt(); switch (stato) case 1: fState = STATE_IDLE ... '" Il lato negativo è che sposta la verifica dal tempo di compilazione al tempo di esecuzione, che era il punto intero di '@ IntDef' iniziare con. (Anche il risultato non è particolarmente gestibile se si aggiungono frequentemente dei valori.) Si potrebbe anche fare una tabella di ricerca secondaria per simulare il risultato di "Enum.values ​​()". – lilbyrdie

5
@Status int state1=bundle.getInt(STATE_ELEMENT1); 
setStatus1(state1); 
//instead of direct setStatus1(bundle.getInt(STATE_ELEMENT1); 
+0

Immagino che questo non controlli se il valore è valido, quindi usalo solo se sai che deve essere un @Status nel tuo caso. tuttavia, in particolare, poiché OP ha chiesto di non essere disturbato dall'avvertimento –

Problemi correlati