25

Ein solcher Fall ist ein int von einem Bundle zu lesen und sie in die Variable beschränkt durch @IndDef Anmerkung zu speichern:Wie deaktiviere ich Android @IntDef-Annotationsprüfungen in besonderen Fällen?

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 

Es muss eine Möglichkeit vorhanden sein, die Überprüfung zu unterdrücken oder von int nach @ Gießen MainActivity.State int um die Variable in der letzten Zeile zu setzen. Der andere Fall besteht darin, einen negativen Test zu schreiben, der eine Funktion mit einem annotierten Parameter aufruft, der absichtlich den falschen Parameter übergibt, um zu testen, dass in einem solchen Fall die Ausnahme ausgelöst wird. Es muss eine Möglichkeit geben, die Annotationsprüfung zu unterdrücken, um einen solchen Test zu kompilieren.

Antwort

50

Ich habe den Weg gefunden, die Anmerkungsüberprüfungen zu unterdrücken. Eigentlich sind es drei von ihnen:

  1. @SuppressWarnings("ResourceType") hinzufügen vor der Definition der Klasse. In meinem Fall:

    @SuppressWarnings("ResourceType") 
    public class MainActivity extends ActionBarActivity { 
        ... 
    } 
    
  2. hinzufügen @SuppressWarnings("ResourceType") vor der Definition Ihrer Methode. In meinem Fall:

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

Diese beiden Ansätze für mich nicht funktionieren, weil ich Anmerkung Kontrollen auf allen meinen Code wollen, mit Ausnahme nur eine Erklärung.

  1. Um eine Prüfung in einer Zeile zu unterdrücken, fügen Sie einen speziell formatierten Kommentar (!!!) hinzu.

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

Wäre das nicht eine Art sichere Art und Weise sein, einen '@ IntDef' wieder aus einem Bündel zu bekommen einen Schalter auf, es zu tun und die Endergebnis zuweisen basierend auf den Werten? z.B. "' state = getInt(); switch (state) Fall 1: fState = STATE_IDLE ... '" Der Nachteil ist, dass es die Verifikation von der Kompilierzeit zur Laufzeit verschiebt, was der ganze Punkt von '@ IntDef' war beginnen mit. (Das Ergebnis ist auch nicht besonders wartbar, wenn Sie häufig Werte hinzufügen.) Sie können auch eine sekundäre Nachschlagetabelle erstellen, um das Ergebnis von "Enum.values ​​()" nachzuahmen. – lilbyrdie

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

Ich denke, das überprüft nicht, ob der Wert gültig ist, also benutze nur, wenn du weißt, dass es in deinem Fall ein @Status sein muss. allerdings vor allem deshalb, weil OP darum gebeten hatte, sich nicht an der Warnung zu stören –