25

Jeden taki przypadek czyta int z wiązki i przechowywanie go w zmiennej zastrzeżonej przez @IndDef adnotacji:Jak wyłączyć sprawdzanie adnotacji Android @IntDef w szczególnych przypadkach?

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 

Musi być jakiś sposób tłumienia czek lub odlewanie z int do @ MainActivity.State int w celu ustawienia zmiennej w ostatnim wierszu.

Innym przypadkiem jest napisanie negatywnego testu, który wywołuje funkcję z adnotowanym parametrem celowo przekazującym nieprawidłowy parametr w celu sprawdzenia, czy wyjątek został zgłoszony w takim przypadku. Musi istnieć sposób na powstrzymanie sprawdzania adnotacji w celu skompilowania takiego testu.

Odpowiedz

50

Znalazłem sposób na powstrzymanie sprawdzania adnotacji. W rzeczywistości są trzy z nich:

  1. Dodaj @SuppressWarnings("ResourceType") przed definicją klasy. W moim przypadku:

    @SuppressWarnings("ResourceType") 
    public class MainActivity extends ActionBarActivity { 
        ... 
    } 
    
  2. Dodaj @SuppressWarnings("ResourceType") przed definicji swojej metody. W moim przypadku:

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

te dwa podejścia nie działają na mnie, bo chcę kontrole adnotacji na wszystkie moje kodu, za wyjątkiem jednego rachunku.

  1. Aby wyłączyć zaznaczenie pojedynczej linii, należy dodać specjalnie sformatowany komentarz (!!!).

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

Would not typu bezpieczny sposób, aby uzyskać '@ IntDef' wycofać się z wiązki będzie zrobić przełącznik na nim i przypisać wynik końcowy opartą na wartościach? na przykład "state = getInt(); switch (stan) case 1: fState = STATE_IDLE ..." "Wadą jest to, że przenosi weryfikację z czasu kompilacji na czas wykonywania, który był całym punktem' @ IntDef' najpierw. (Rezultat nie jest szczególnie łatwy w utrzymaniu, jeśli często dodajesz wartości.) Możesz również wykonać drugorzędną tabelę odnośników, aby naśladować wynik "Enum.values ​​()". – lilbyrdie

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

Myślę, że to nie sprawdza, czy wartość jest poprawna, więc używaj tylko, jeśli wiesz, że to musi być @Status w twoim przypadku. ale nawet z awansu, zwłaszcza że OP poprosił, aby nie przejmować się ostrzeżeniem –

Powiązane problemy