26

そのようなケースの 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.State int にキャストする何らかの方法が必要です。

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

4

2 に答える 2

52

注釈チェックを抑制する方法を見つけました。実際には、次の 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);
    
于 2014-12-26T16:38:13.497 に答える