使用Android Support Annotations优化代码

本文深入解析Android Support Annotations库,通过@NonNull、@Nullable、@CheckResult等注解,揭示如何有效捕获和预防代码中的潜在bug。重点介绍了如何利用@StringRes注解避免资源ID误用问题,以及@Keep注解在代码混淆时保护关键函数或类的重要性。文章强调了支持注解在提高代码质量和安全性方面的显著作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


原文链接: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已经被包含在里面了,可以立刻开始使用它了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值