web-dev-qa-db-ja.com

特別な場合にAndroid @IntDefアノテーションチェックを無効にするにはどうすればよいですか?

そのようなケースの1つは、バンドルから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.Stateintにキャストしたりする方法が必要です。

もう1つのケースは、そのような場合に例外がスローされることをテストするために、意図的に間違ったパラメーターを渡す注釈付きパラメーターを持つ関数を呼び出すネガティブテストを作成することです。このようなテストをコンパイルするには、アノテーションチェックを抑制する方法が必要です。

26
Nicol Eye

注釈チェックを抑制する方法を見つけました。実際には、3つあります。

  1. クラスの定義の前に@SuppressWarnings("ResourceType")を追加します。私の場合:

    _@SuppressWarnings("ResourceType")
    public class MainActivity extends ActionBarActivity {
        ...
    }
    _
  2. メソッドの定義の前に@SuppressWarnings("ResourceType")を追加します。私の場合:

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

1つのステートメントだけを除いて、すべてのコードで注釈チェックが必要なため、これら2つのアプローチは機能しません。

  1. 1行のチェックを抑制するには、特別にフォーマットされたコメント(!!!)を追加します。

    _//noinspection ResourceType
    fState = savedInstanceState.getInt(BUNDLE_STATE);
    _
52
Nicol Eye
@Status int state1=bundle.getInt(STATE_ELEMENT1);
setStatus1(state1);
//instead of direct setStatus1(bundle.getInt(STATE_ELEMENT1);
5
Andrew Glukhoff