使用Android Support Annotations优化你的代码

@author ASCE1885的 简书

原文链接

如果你还没有听说过Android Support Annotations 函数库,你将错过一个整洁的新软件包,它有助于你捕获程序中的bugs。该函数库包含了许多的Java注解,用于帮助Android Studio检测代码中可能存在的错误,并报告给开发者。注解类型有很多种,本文将只介绍其中几种,请一定要自己阅读文档以了解本文未介绍的其他注解类型。

@NONNULL / @NULLABLE

@NonNull和@Nullable可能是support annotations最基础的也是最有用的注解之一了。使用这两个注解修饰的函数参数或者函数,表示参数或者函数返回值是否可以为空,之后 Android Studio在代码可能出现不安全的情况下会给出智能提示。

使用注解前后对比如下:

未使用注解:

191937-37cf9c83be0c7f29.png

使用@NonNull注解:

191937-6686c8a1ec4b6ac9.png

更进一步,我们可以使用@CheckResult注解来让使用者知道该函数的返回值是需要使用的,没有使用函数的返回值则Android Studio会给出警告提示:

checkreturn.png

@STRINGRES / @DRAWABLERES等

你是否遇到过尝试调用TextView的setText函数,结果出现如下异常:

android.content.res.Resources$NotFoundException: String resource ID #0x3039

当你给setText函数传入一个整型值,TextView将它作为一个String资源id对待,并会进行查找以便设置这个字符串。如果存在一个可以标识整型值是非法ids的注解就好了,@StringRes正是用来实现这个功能的!

public void setText(@StringRes int id) {
  // Do something like getString(id), etc.
}

现在如果你试图传递一个非字符串的资源id给这个函数,你将得到如下提示:

stringres.png

所有的资源类型都存在类似的注解,例如@DrawableRes, @ColorRes, @InterpolatorRes等等。

@KEEP

最近我发现一个新的support annotation注解@Keep。根据support annotations文档说明,这个注解还没有被关联到Gradle插件中,被这个注解修饰的函数或者类,在代码混淆进行压缩时会被保持住。

如果你曾经在使用Proguard时使用过

-keep class com.foo.bar { public static <methods> }

你会知道当尝试把某个特定的函数或者类从优化操作中排除掉是多么痛苦的事情。使用这个注解将会告诉Proguard不要对指定的函数或者类进行优化操作:

public class Example {
  @Keep
  public void doSomething() {
      // hopefully this method does something
  }
  ...
}

好消息是,如果你已经使用了appcompat-v7,那么support-annotations已经被包含在里面了,可以立刻开始使用它了。