2015年6月14日日曜日

android.support.annotation を活用する

利用するには dependencies に追加します。 dependencies { compile "com.android.support:support-annotations:22.0.2" } 参考 上記のドキュメントに書いてありますが、例えば

@Nullable を指定している変数に対して NPE になるようなコードを書くと警告してくれます。



alt + enter で修正候補がでます。



2番目の Replace with 'd != null ?:' を選択するとこんな感じになります。



@NonNull が指定された変数に null を渡そうとすると警告してくれます。



リソースIDはどれも int なので、Drawable のリソースIDを意図しているところに別のリソースIDを渡すことができてしまいます。



そこで Drawable のリソースIDを意図しているところに @DrawableRes を付けると、別のリソースIDを渡そうとしたところがエラーになります。



@StringRes や @LayoutRes など主要なものはそろっています。なにがあるかは package summary で確認してください。

@IntDef や @StringDef では、int や String に対して取りうる値のセットが定義されたアノテーションを作ることができます。
public static final int SIZE_L = 0; public static final int SIZE_M = 1; public static final int SIZE_S = 2; @Retention(RetentionPolicy.SOURCE) @IntDef({SIZE_L, SIZE_M, SIZE_S}) public @interface Size { } @Size public abstract int getSize(); public abstract void setSize(@Size int size); public static final String FORMAT_XML = "xml"; public static final String FORMAT_JSON = "json"; @Retention(RetentionPolicy.SOURCE) @StringDef({FORMAT_XML, FORMAT_JSON}) public @interface FORMAT { } public abstract void fetchData(@FORMAT String format); @IntDef は enum だけでなく flag としても使うことができます。 public static final int SHOW_TITLE = 0x1; public static final int SHOW_SUB_TITLE = 0x2; public static final int SHOW_ICON = 0x4; @Retention(RetentionPolicy.SOURCE) @IntDef(flag = true, value = { SHOW_TITLE, SHOW_SUB_TITLE, SHOW_ICON, }) public @interface TitleOptions { } 詳しくは Creating Enumerated Annotations を見るとよいです。



22.2.0で追加されたアノテーション

22.2.0 で新しく 13個のアノテーションが追加されました。上記のドキュメント及び android.support.annotation のパッケージサマリーにはまだないですが、そのうち更新されるでしょう。
Android Studio を 1.3 にしないと警告やエラーがでてくれないので注意です。
  • BinderThread
  • CallSuper
  • CheckResult
  • ColorInt
  • FloatRange
  • IntRange
  • Keep
  • MainThread
  • RequiresPermission
  • Size
  • TransitionRes
  • UiThread
  • WorkerThread
MainThread, WorkerThread, (BinderThread, UiThread), FloatRange, IntRange, Size, CallSuper, CheckResult, ColorInt, RequiresPermission は Google I/O 2015 のセッション「What's New in Android Development Tools」で紹介されていました。



実行スレッド系
- BinderThread
- MainThread
- UiThread
- WorkerThread

メソッドやクラスの実行スレッドを明記する。クラスにつけた場合はそのクラスのメソッド全てが対象になります。
MainThread と UiThread の違いがわからない...

↓バックグラウンドで @MainThread のメソッドを呼ぶと怒られます。



↓@MainThread がついてるメソッドで @WorkerThread のメソッドを呼ぶと怒られます。





値指定系
- FloatRange
- IntRange
- Size

@FloatRange

↓@FloatRangeの範囲外の値を指定すると怒られます。



Float とついているが double にも使えます。



@IntRange

↓@IntRangeの範囲外の値を指定すると怒られます。



Int とついているが long にも使えます。



@Size

@Size は size や length の指定ができます。文字列の長さや array, collection のサイズに使います。





multiple で約数を指定することもできます。



その他
- CallSuper
- CheckResult
- ColorInt
- Keep
- RequiresPermission

@CallSuper

↓@CallSuper を指定したメソッドをOverrideしてsuperを呼ばないと怒られます。





@CheckResult

↓@CheckResult を指定したメソッドを呼び出して戻り値を利用しないと怒られます。





@ColorInt

↓@ColorInt に color リソースID を渡すと怒られます。





@Keep

@Keep はビルド時に minified されたコードから外さないでほしいことを明示するためのアノテーションです。



@RequiresPermission

@RequiresPermission は必要なパーミッションを明示するためのアノテーションです。 @RequiresPermission(Manifest.permission.NFC) public abstract void scanNfc(); ↓パーミッションが無い状態で、それを必要とするAPIを呼ぶと怒ってくれるようになりました。









0 件のコメント:

コメントを投稿