Androidメモ: リソース ID を示す変数やパラメータにアノテーションを付ける

リソース ID を表す int 変数に付けるアノテーション

Android の各種リソースの ID は int 型で管理されています。 この値を変数に格納したり、メソッドのパラメータとして受け取るように実装した場合、不正な int 値が渡されて実行時に落ちてしまうリスクがあります。

このようなことをできるだけ防ぐため、Android Support ライブラリには下記のようなアノテーションが用意されており、これらを付加した int 型変数には、指定した種類のリソースの ID しか格納できなくなります(AndroidStudio で警告が表示されるようになります)。

アノテーションリソース ID の種類
@AnimatorResR.animator.xxx で参照するリソース ID
@AnimResR.anim.xxx で参照するリソース ID
@AnyResいずれかの種類のリソースの ID(他の具体的なアノテーションを使用することを推奨)
@ArrayResR.array.xxx で参照するリソース ID
@AttrResR.attr.xxx で参照するリソース ID
@ColorResR.color.xxx で参照するリソース ID
@DimenResR.dimen.xxx で参照するリソース ID
@DrawableResR.drawable.xxx で参照するリソース ID
@FontResR.font.xxx で参照するリソース ID
@IdResR.id.xxx で参照するリソース ID
@IntegerResR.interger.xxx で参照するリソース ID
@InterpolatorResR.interpolator.xxx で参照するリソース ID
@LayoutResR.layout.xxx で参照するリソース ID
@NavigationResR.navigation.xxx で参照するリソース ID
@RawResR.raw.xxx で参照するリソース ID
@StringResR.string.xxx で参照するリソース ID
@StyleableResR.styleable.xxx で参照するリソース ID
@StyleResR.style.xxx で参照するリソース ID
@TransitionResR.transition.xxx で参照するリソース ID

int 変数用アノテーションの使用例

上記のようなアノテーションは Annotation Support Library で提供されているため、build.gradle に下記のような依存を追加しておく必要があります(参考: 本家ドキュメント)。

com.android.support:support-annotations:24.2.0

下記は、color 値のリソース ID のみを格納できる int 型フィールドを定義する例です。

@ColorRes
private int mainColorResId = R.color.white;

メソッドのパラメータにもアノテーションを付けることができます。 下記のように指定された int 型パラメータには、文字列リソースを示す ID しか渡せなくなります。

public class ResourceResolver {
    ...
    public String getString(@StringRes int resId) {
        return context.getString(resId);
    }
}

android.support.annotation パッケージ には他にもいろいろなアノテーションが定義されているので、ざっと見ておくとよいでしょう。 例えば、int 型用のアノテーションとしては、上記のようなリソース ID 関連のものだけではなく、AARRGGBB 形式のカラー値であることを示すアノテーションが定義されていたりします。