Подтвердить что ты не робот

Как отключить аннотацию Android @IntDef в особых случаях?

Одним из таких случаев является чтение int из Bundle и сохранение его в переменной, ограниченной аннотацией @IndDef:

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

Должен быть какой-то способ подавить проверку или кастинг от int до @MainActivity.State int, чтобы установить переменную в последней строке.

В другом случае нужно написать отрицательный тест, который вызывает функцию с аннотированным параметром, преднамеренно передающую неправильный параметр, чтобы проверить, что в этом случае возникает исключение. Должен быть способ подавить проверку аннотации, чтобы скомпилировать такой тест.

4b9b3361

Ответ 1

Я нашел способ подавить проверки аннотаций. На самом деле их три:

  • Добавьте @SuppressWarnings("ResourceType") перед определением вашего класса. В моем случае:

    @SuppressWarnings("ResourceType")
    public class MainActivity extends ActionBarActivity {
        ...
    }
    
  • Добавьте @SuppressWarnings("ResourceType") перед определением вашего метода. В моем случае:

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

Эти два подхода не работают для меня, потому что я хочу, чтобы аннотации проверялись на весь мой код, за исключением одного заявления.

  1. Чтобы подавить проверку в одной строке, добавьте специально отформатированный комментарий (!!!).

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

Ответ 2

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