使用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可能是support annotations最基础的也是最有用的注解之一了。使用这两个注解修饰的函数参数或者函数,表示参数或者函数返回值是否可以为空,之后 Android Studio在代码可能出现不安全的情况下会给出智能提示。
使用注解前后对比如下:
未使用注解:
使用@NonNull注解:
官方解释:
在移除警告之后, when the program runs 到底是个什么意思,是运行无异常,还是说在会触发空指针的地方没问题。不解到底是for static analysis还是for runtime.而且明明as是不会给warning的,只是一个小提示而已。
所以做了个试验如下:
有提醒,!null是恒成立的,也就是说是个runtime咯?于是不加判断,直接传入null,然后程序崩溃。
于是看看这个注解怎么写的:
从而得知,@NonNull这个注解应该不是for
runtime,但是这个注解有问题,基本没作用。
更进一步,我们可以使用@CheckResult注解来让使用者知道该函数的返回值是需要使用的,没有使用函数的返回值则Android
Studio会给出警告提示
你是否遇到过尝试调用TextView的setText函数,结果出现如下异常:
当你给setText函数传入一个整型值,TextView将它作为一个String资源id对待,并会进行查找以便设置这个字符串。如果存在一个可以标识整型值是非法ids的注解就好了,@StringRes正是用来实现这个功能的!
现在如果你试图传递一个非字符串的资源id给这个函数,你将得到如下提示:
最近我发现一个新的support annotation注解@Keep。根据support annotations文档说明,这个注解还没有被关联到Gradle插件中,被这个注解修饰的函数或者类,在代码混淆进行压缩时会被保持住。
如果你曾经在使用Proguard时使用过
你会知道当尝试把某个特定的函数或者类从优化操作中排除掉是多么痛苦的事情。使用这个注解将会告诉Proguard不要对指定的函数或者类进行优化操作:
好消息是,如果你已经使用了appcompat-v7,那么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注解来让使用者知道该函数的返回值是需要使用的,没有使用函数的返回值则AndroidStudio会给出警告提示
@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已经被包含在里面了,可以立刻开始使用它了。
相关文章推荐
- Understanding Annotations in Java
- TestNG基本概念和注解
- Jdk1.5 Annotations
- fushion chart的使用
- ubuntu10.10 eclipse编译hadoop1.0.X
- java 注释 : annotations 元数据
- 组件框架技术tapestry及简单对比
- JDK1.5 注释语法(Annotations)新鲜试用
- .NET MSChart画图:曲线,柱形,曲线叠加图,以及配置,下载示意图
- Hibernate利用注释进行配置
- android annotations Rest Get GsonHttpMessageConverter 获取服务端简单数据
- 黑马程序员 Java JDK1.5与JDK1.6的新特性
- 最近开始学习Java
- 【转】Selenium Grid 个人理解
- jdk5 best practice
- 谈谈Spring 2.x中简化配置的问题
- 深入解读HTML 5新语法 助力提高语义价值
- Hibernate Annotation笔记
- Effective Java 第二版和第一版的条目的增删
- Java类文件结构