【问题标题】:How do I disable Android @IntDef annotation checks in special cases?如何在特殊情况下禁用 Android @IntDef 注释检查?
【发布时间】:2015-02-12 23:08:52
【问题描述】:

这样的一种情况是从 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。

另一种情况是编写一个否定测试,调用带有注释参数的函数,故意传递错误的参数,以测试在这种情况下是否抛出异常。为了编译这样的测试,必须有一种方法来禁止注解检查。

【问题讨论】:

    标签: android casting annotations android-support-library suppress


    【解决方案1】:

    我找到了抑制注释检查的方法。实际上,一共有三个:

    1. 在你的类定义之前添加@SuppressWarnings("ResourceType")。就我而言:

      @SuppressWarnings("ResourceType")
      public class MainActivity extends ActionBarActivity {
          ...
      }
      
    2. 在方法定义之前添加@SuppressWarnings("ResourceType")。就我而言:

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

    这两种方法对我不起作用,因为我想对我的所有代码进行注释检查,除了一个语句。

    1. 要禁止对单行进行检查,请添加特殊格式的注释 (!!!)。

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

    【讨论】:

    • @IntDef 从包中取出不是一种类型安全的方法是对其进行开关并根据值分配最终结果吗?例如"state = getInt(); switch (state) case 1: fState = STATE_IDLE ..." 不利的一面是它将验证从编译时移到运行时,这就是@IntDef 的重点。 (如果您经常添加值,结果也不是特别易于维护。)您还可以执行辅助查找表来模拟“Enum.values()”的结果。
    【解决方案2】:
    @Status int state1=bundle.getInt(STATE_ELEMENT1);
    setStatus1(state1);
    //instead of direct setStatus1(bundle.getInt(STATE_ELEMENT1);
    

    【讨论】:

    • 我猜这不会检查该值是否有效,因此只有在您知道它必须是 @Status 时才使用。虽然赞成,特别是因为 OP 要求不要被警告打扰
    猜你喜欢
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多