How do I disable Android @IntDef annotation checks in special cases?

北城余情 提交于 2019-12-20 16:30:07

问题


One such case is reading an int from a Bundle and storing it into the variable restricted by @IndDef annotation:

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

There must be some way of suppressing the check or casting from int to @MainActivity.State int in order to set the variable in the last line.

The other case is to write a negative test that calls a function with annotated parameter intentionally passing the wrong parameter in order to test that the Exception is thrown in such case. There must be a way to suppress annotation check in order to compile such test.


回答1:


I've found the way to suppress the annotation checks. Actually, there are three of them:

  1. Add @SuppressWarnings("ResourceType") before the definition of your class. In my case:

    @SuppressWarnings("ResourceType")
    public class MainActivity extends ActionBarActivity {
        ...
    }
    
  2. Add @SuppressWarnings("ResourceType") before the definition of your method. In my case:

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

These two approaches do not work for me, because I want annotation checks on all of my code, except for just one statement.

  1. To suppress a check on a single line add a specially formatted comment (!!!).

    //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);


来源:https://stackoverflow.com/questions/27474142/how-do-i-disable-android-intdef-annotation-checks-in-special-cases

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!