如何在特定情况下禁用Android @IntDef注释检查?

26

其中一种情况是从Bundle读取int并将其存储到由@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,以便在最后一行中设置变量。

另一种情况是编写一个负面测试,它调用一个带注释参数的函数,有意传递错误的参数,以便测试在这种情况下是否抛出异常。必须有一种方法来抑制注释检查,以便编译此类测试。

2个回答

52

我找到了禁止注释检查的方法。实际上,有三种方法:

  1. 在您的类定义之前添加@SuppressWarnings("ResourceType")。 在我的情况下:

    @SuppressWarnings("ResourceType")
    public class MainActivity extends ActionBarActivity {
        ...
    }
    
  2. 在您的方法定义之前添加@SuppressWarnings("ResourceType")。 在我的情况下:

  3. @Override
    @SuppressWarnings("ResourceType")
    protected void onCreate(Bundle savedInstanceState) {
        ...
    }
    
    这两种方法对我来说都不起作用,因为我想要在我的所有代码上进行注释检查,除了一个语句之外。
    要在单行代码上抑制检查,可以添加一个特殊格式的注释(!!!)。
    //noinspection ResourceType
    fState = savedInstanceState.getInt(BUNDLE_STATE);
    

1
从Bundle中获取@IntDef的类型安全方式难道不是通过对其进行switch并根据值分配最终结果吗?例如:"state = getInt(); switch (state) case 1: fState = STATE_IDLE ..." 缺点是将验证从编译时移动到运行时,这正是@IntDef的初衷。(如果经常添加值,则结果也不特别可维护。)您还可以执行二次查找表以模拟“Enum.values()”的结果。 - lilbyrdie

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

我猜测这段代码并没有检查值是否有效,所以只有在你确定它必须是你的情况下才使用@Status。尽管如此,我还是点了赞,特别是因为问题提问者要求不要受到警告打扰。 - Nino van Hooff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接