查看原文
其他

Annotation可以放心使用吗?

2017-08-02 承香墨影 承香墨影

版权声明:

本公众号发布的所有文章,未特殊署名,均属于原创,版权归本公众号所有。

转载请参阅公众号的:《转载授权》。


一、什么是Annotation
Android Annotation Library(后文简称 Annotation )是 Android Support Library 中提供的一个函数包,它包含了诸多有用的元注解,使用注解的形式,用来帮助 Android 开发者,在代码的编译期、编写期就发现可能存在的Bug。

配置好 lint 文件,在编译期间,如果出现一些不合规的使用情况,在严格的情况下,会直接终止编译。

一般使用 Android Studio(后文简称 AS )进行开发,在 Android Studio -> Preferences -> Editor -> Inspections 中,开启 Lint 检查,就可以在编写代码期间,如果有不合规的情况下,就会有提示提示开发者,某行代码有问题,需要调整一下。这里的设置,建议全部打开,这样有利于提高代码质量。

二、Annotation 怎么用?

1、举个简单的例子

Annotaion 既然是以注解的形式存在,使用起来非常的简单。它可以直接被标记在方法上、方法的参数上、方法的返回值上等等。

这里就最常见的一个 Annotation-Nullness 举个例子。

Nullness存在两个注解,可用在方法的返回值和参数上:

  • @Nullable:表示当前被标注的参数或者返回值,可以为null。

  • @NonNull:表示当前被标注的参数和返回值,不能为null。

如果在函数声明的时候,使用了 Nullness 这两个注释,在编写的时候,如果存在了违反该注释的代码时,AS会立刻给出提示,在编译的时候,也会提示错误。

也可以通过 Analyze -> Inspect code… 也可以通过静态分析代码,来暴露出这些问题。

2、这里有没有坑?

如果像上面举的例子里,使用 @NonNull 限定了之后,是不是就可以杜绝 空指针的 Bug ,在使用的时候放心大胆的调用呢?

其实不然,Annotation 只是对代码规范进行了一些限制,但是它只是在编译期生效,并且是静态分析。所以实际上,如果上面的代码,换一种写法就不会有错误提示。

所以虽然用 Annotation ,但是该做的判断还是需要做,它只是起到一个辅助检查的作用,并不能完全保证外部的数据完全依照规定的 Annotation 约束。并且Annotation 只能检测出直接违反约束的调用方式。

三、其他Annotation

1、资源类型注解

Annotation 还提供了一系列 XxxRes 的注解,它和 Nullness 一样,可以被标记在方法的参数和返回值上。主要用于标注限定一系列资源的 ID 。在 Android 中,资源文件最终都会被 aapt 生成一个 R.java 文件中,最终表现在 Java 代码中,就是一个个的 int 类型的值。那么例如有些方法,需要限定传入的参数上一个 Drawable 的 ID ,那么就可以使用 @DrawableRes 这个 Annotation 注解来标记。
这里只是举个例子,其实 Android 内,基本上提供的所有类型的资源,在 Annotation 中都有对应的注解,需要的时候可以直接找来用,例如: @LayoutRes 、 @StringRes ,这些都是比较常用的,看名称就可以知道是什么意思,就不一一解释了。

2、线程注解

Android 应用开发过程中,如果涉及到多线程的使用,如果编写的方法,如果有线程要求,例如:操作 UI 必须在主线程、耗时操作必须在子线程等情况,就可以使用线程注解来标记。
线程注解有四个可用的注解,被标记在方法之上:

  • @UiThread : 标记当前方法需要在UI线程调用。

  • @MainThread : 标记当前方法需要在主线程调用。

  • @WorkerThread : 标记当前方法需要在子现场调用。

  • @BinderThread : 标记当前方法需要在Binder线程调用。

举个例子:

3、标记需要被重写的方法。

当一个类,必然会被重载的时候,如果我们需要标记需要被重写的方法,可以使用 @CallSuper 来标记这个方法,这样如果有子类继承它,就会被要求子类重写该方法。

4、标记不被混淆

当编译的时候,如果开启了混淆,就会进行代码的混淆。
如果有一些类或者方法,不想被混淆,又懒得单独配置混淆文件,可以使用 @Keep 来标记。用了 @Keep 之后,在编译的时候就不会把该方法或者该类混淆。

5、权限注解

Android 中有场景都需要使用一些权限,无论是静态注册还是到现在可以动态注册,如果没有获取权限的时候调用了一些需要权限的方法,就会导致程序崩溃。
这个时候可以使用 @RequiresPermission 注解即可限定这个方法需要的权限,外部调用的时候会得到静态分析的结果。

6、忽略警告注解

有时候编译器,会提示一些 Warning ,注意这里不是 Bug ,只是警告。如果开发人员明确这里的警告没有问题,不会影响功能。那么,可以使用 @SuppressWarnings 来标记方法,这样 lint 就会忽略这个警告。

7、其他不常用的注解

还有一些比较不常用的 Annotation ,反正正常工作中,基本上用不上,比较冷门,这里也简单介绍一下。

@size:用于限定方法的参数在一个范围内。

@IntRange:用于限定方法的参数,如果是int或者long,在一个合理的范围内。

@FloatRange:和@IntRange类似。

@Retention+@IntDef,用于限定取值范围,类似枚举的效果。

@CheckResult:标记当前方法的返回值是重要的,调用之后需要使用这个返回值。

四、结语

Annotation 只是中规范的约束,只能起到辅助我们去更好的执行代码规范,把一些错误在编译期就避免掉,提高代码质量。

但是它也不是万能的,该有判断的地方还是不能省略。


推荐阅读:



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存