您的位置:首页 > 移动开发 > Android开发

使用Android Support Annotations优化代码

2016-01-07 12:02 555 查看
原文链接:http://michaelevans.org/blog/2015/07/14/improving-your-code-with-android-support-annotations/

本文有翻译+个人使用心得。

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


@NONNULL / @NULLABLE

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

使用注解前后对比如下:

未使用注解:



使用@NonNull注解:



官方解释:



在移除警告之后, when the program runs 到底是个什么意思,是运行无异常,还是说在会触发空指针的地方没问题。不解到底是for static analysis还是for runtime.而且明明as是不会给warning的,只是一个小提示而已。

所以做了个试验如下:



有提醒,!null是恒成立的,也就是说是个runtime咯?于是不加判断,直接传入null,然后程序崩溃。

于是看看这个注解怎么写的:



从而得知,@NonNull这个注解应该不是for
runtime,但是这个注解有问题,基本没作用。


@CheckResult

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




@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给这个函数,你将得到如下提示:




@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已经被包含在里面了,可以立刻开始使用它了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息