其中一种情况是从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,以便在最后一行中设置变量。
另一种情况是编写一个负面测试,它调用一个带注释参数的函数,有意传递错误的参数,以便测试在这种情况下是否抛出异常。必须有一种方法来抑制注释检查,以便编译此类测试。
@IntDef
的类型安全方式难道不是通过对其进行switch并根据值分配最终结果吗?例如:"state = getInt(); switch (state) case 1: fState = STATE_IDLE ...
" 缺点是将验证从编译时移动到运行时,这正是@IntDef
的初衷。(如果经常添加值,则结果也不特别可维护。)您还可以执行二次查找表以模拟“Enum.values()”的结果。 - lilbyrdie