まくまくAndroidノート
リソース ID を示す変数やパラメータにアノテーションを付ける
2019-02-18
Android の Annotation Support Library は、int 型変数の用途を限定するためのアノテーションを提供しています。このアノテーションを使用することで、想定外の値が int 変数に格納されてしまうのを防ぐことができます。

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

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

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

アノテーション リソース ID の種類
@AnimatorRes R.animator.xxx で参照するリソース ID
@AnimRes R.anim.xxx で参照するリソース ID
@AnyRes いずれかの種類のリソースの ID(他の具体的なアノテーションを使用することを推奨)
@ArrayRes R.array.xxx で参照するリソース ID
@AttrRes R.attr.xxx で参照するリソース ID
@ColorRes R.color.xxx で参照するリソース ID
@DimenRes R.dimen.xxx で参照するリソース ID
@DrawableRes R.drawable.xxx で参照するリソース ID
@FontRes R.font.xxx で参照するリソース ID
@IdRes R.id.xxx で参照するリソース ID
@IntegerRes R.interger.xxx で参照するリソース ID
@InterpolatorRes R.interpolator.xxx で参照するリソース ID
@LayoutRes R.layout.xxx で参照するリソース ID
@NavigationRes R.navigation.xxx で参照するリソース ID
@RawRes R.raw.xxx で参照するリソース ID
@StringRes R.string.xxx で参照するリソース ID
@StyleableRes R.styleable.xxx で参照するリソース ID
@StyleRes R.style.xxx で参照するリソース ID
@TransitionRes R.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 形式のカラー値であることを示すアノテーションが定義されていたりします。

2019-02-18