Android如何使用注解进行代码检查
原文首发于微信公众号:躬行之(jzman-blog),欢迎关注交流!
Android Studio 内置了代码检查工具 Lint,可在菜单栏选择 Analyze > Inspect Code 执行相应的代码检查,代码检查能够根据推断一些不合法的潜在问题,有助于在开发阶段发现开发者因为主管原因导致的一下代码问题,Android 官方提供了注解库 support-annotations 来帮助开发者及早发现问题,下面是常用的一些注解,主要内容如下:
- Nullness注解
- 资源注解
- 线程注解
- 值约束注解
- 权限注解
- 返回值注解
- CallSuper注解
- Typedef注解
- 可访问性注解
Nullness注解
使用 Nullness 注解可以检查给定变量、参数和返回值是否允许 null 值,具体如下:
- @Nullable :表示可以为 null 的变量、参数或返回值,
- @NonNull :表示不可为 null 的变量、参数或返回值。
@NonNull
@Override
public View onCreateView(String name, @NonNull Context context,@NonNull AttributeSet attrs) {
//...
}
资源注解
资源注解的使用可使得在源码阶段让编辑器检查书写的不规范,也可在一定程度上优化代码结构,下面是常见的资源注解如下:
- @StringRes: 表示检查是否包含R.string引用
- @ColorRes: 表示检查是否包含R.color引用
- @ColorInt: 表示检查是否包含表示颜色的整型
- @DrawableRes: 表示检查是否包含R.drawable引用
- @DimenRes: 表示检查是否包含R.dimen引用
- @InterpolatorRes:表示检查是否包含插值器引用
线程注解
线程注解可以检查某个方法是否从某个特定类型的线程中调用,支持一下线程注解,具体如下:
- @MainThread:表示主线程
- @UiThread:表示 UI 线程
- @WorkerThread:表示工作线程
- @BinderThread:表示Binder线程
- @AnyThread:表示任何一个线程
上述注解中 @MainThread 和 @UiThread 在大多时候表示的都是同一线程,如果应用中带有多个试图,UI 线程可与主线程不同,故可使用 @UIThread 标注与应用的视图层次相关联的方法,使用 @MainThread 仅标注与应用生命周期相关联的方法。线程注解最常用的一个用途是 AsyncTask 使用中的方法替换,因为 AsyncTask 会执行后台操作并将结果发布到 UI 线程。
值约束注解
使用值约束注解可验证传递的参数的值的合法性,可以借此指定参数的设置范围,可在一定程度上减少代码在主观程度上出现的错误,常见的值约束注解如下:
- @IntRange:表示可以验证整型参数是否在指定范围内
- @FloatRange:表示可以验证浮点型参数是否在指定范围内
- @Size:表示可以验证集合、数组、字符串参数是否在指定范围内,可指定最大值、最小值以及确切值
上面的注解有一些可使用的参数,如 from、to、min 等,使用时具体在某个注解体重查看定义即可。
权限注解
权限注解 @RequiresPermission 可以验证方法调用方的权限,即当使用了权限注解的方法时会检查有没有指定的权限,如果没有则会提示要在 AndroidManifest.xml 文件中申明权限,如果是危险权限还有进行权限动态申请,使用方式参考如下:
/**
* 单个权限检查
* @param message
*/
@RequiresPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
public void setMessage(String message) {
}
/**
* 全部权限检查
* @param message
*/
@RequiresPermission(allOf = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE})
public void setMesage(String message) {
}
/**
* 某个权限检查
* @param message
*/
@RequiresPermission(anyOf = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE})
public void setMesage(String message) {
}
返回值注解
返回值注解 @CheckResult 会检查某个方法的返回值是否被使用,如果没有被使用,则会根据 suggest 配置建议使用相同公民没有返回值的另一个方法,如果返回值使用了,则和未加该注解的方法一样,使用方式参考如下:
@CheckResult(suggest="#enforcePermission(String,int,int,String)")
public int checkPermission(@NonNull String permission, int pid, int uid){
return 0;
}
如果没有使用返回值提示如下:
当返回值没有被使用,则会建议使用相同功能没有返回值的另一个方法,简而言之,返回值注解 @CheckResult 能够表示某个方法实际使用的时方法本身的处理还是方法最终的处理结果。
CallSuper注解
使用 @CallSuper 注解会验证子类的重写方法是否调用父类的实现,这样约束的好处是可保证父类的实现不会修改,当然,如果不使用该注解,子类重写父类的方法可以不调用弗父类的默认实现,具体参考如下:
/**
* 父类
* @CallSuper注解的使用
*/
public class Test {
//使用@CallSuper注解,子类重写该方法时必须调用该方法
@CallSuper
protected void onCreate(){
}
}
下面是 Test 类的实现类:
/**
* 子类
* @CallSuper注解的使用
*/
public class TestImpl extends Test{
@Override
protected void onCreate() {
super.onCreate();
/**
* 如果不调用父类的方法,则会提示
* Some methods, such as View#onDetachedFromWindow, require that you also call the super implementation as part of your method.
*/
}
}
Typedef注解
使用 @IntDef 和 @StringDef 注解 可以创建整型和字符串的枚举注解来验证其他代码中使用的某些整型和字符串,可以保证代码中的某些常量整型或常量字符串是某些具体定义的常量集,这两个注解的位置只能是注解。
开发中总会使用到枚举,枚举在一定程度上可使得代码结构更清晰,但枚举的使用会增加内存的开销,这里可以用 Typedef 注解的方式来代替枚举,下面是 Tyoedef 注解的使用,参考如下:
/**
* Typedef 注解的定义
*/
public class ActionType {
public static final int ACTION_TYPE_0 = 0;
public static final int ACTION_TYPE_1 = 1;
public static final int ACTION_TYPE_2 = 2;
@Retention(RetentionPolicy.SOURCE)
@IntDef({ACTION_TYPE_0,ACTION_TYPE_1,ACTION_TYPE_2})
public @interface ActionTypeDef{
}
}
下面是上述 Typedef 注解的使用方式,参考如下:
/**
* Typedef注解的使用
* @param value
*/
private void setValue(@ActionType.ActionTypeDef int value) {
switch (value) {
case ActionType.ACTION_TYPE_0:
break;
case ActionType.ACTION_TYPE_1:
break;
case ActionType.ACTION_TYPE_2:
break;
// case 100://不能使用未定义的整型
// break;
}
}
可见 Typedef 注解约束了使用到的某些整型,当然还可以是字符串,这样也能达到枚举的作用。
可访问性注解
可访问性注解是 @VisibleForTesting 和 @Keep 可以表示方法、字段、类的可访问性。具体如下:
- @VisibleForTesting:表示注解的某个代码块的可见性高于能够测试时需要的水平
- @Keep:表示被注解的代码块将不会被混淆。
最常用的可能就是资源注解,如 @StringRes、@ColorRes、@ColorInt等,还有Typeof 注解,该注解可以在替换枚举在 Android 开发中带来的性能影响,如果平时留意这些注解在 Android 源码中也经常使用,所以可在开发过程中尝试去使用这些注解以进行必要的代码检查。
可以关注公众号:躬行之(jzman-blog),一起交流学习。
Android如何使用注解进行代码检查的更多相关文章
- 2.2、Android Studio通过注解提升代码检测
使用像Lint这样的代码检测工具可以帮助你发现问题和提升代码,但是代码检测在有些地方很难应用.例如,Android的资源ID,使用一个int类型来表示字符.图像.颜色或者其他资源类型所以代码检测工具不 ...
- Android Studio使用Lint进行代码检查
Android Studio目前已经更新到1.4版本,它作为Google官方推荐的IDE,功能非常强大,其中提供了一套静态代码分析工具,它可以帮助我们检查项目中存在的问题,让我们更有规范性的开发App ...
- Android注解使用之使用Support Annotations注解优化代码
前言: 前面学习总结了Java注解的使用,博客地址详见Java学习之注解Annotation实现原理,从本质上了解到什么注解,以及注解怎么使用?不要看见使用注解就想到反射会影响性能之类,今天我们就来学 ...
- Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架
前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直 ...
- java 命名代码检查-注解处理器
命名代码检查 根据 <Java 语言规范( 第 3 版 ) > 中第6.8节的要求, Java 程序命名应当符合下列格式的书写规范: 类 ( 或接口 ) : 符合驼式命名法, 首字母大写. ...
- Android 代码检查工具SonarQube
http://blog.csdn.net/rain_butterfly/article/details/42170601 代码检查工具能帮我们检查一些隐藏的bug,代码检查工具中sonar是比较好的一 ...
- Android(Java)利用findbugs进行代码静态检查
主要介绍利用java静态代码检查工具findbugs进行代码检查,包括其作用.安装.使用.高级功能(远程review和bug同步). 虽然Android提供了Test Project工程以及instr ...
- Android Studio 之 项目瘦身、代码检查
项目瘦身, 一.删除没有用到的资源(图片,string 等等) 先看怎么样找到没有用到的资源,注意:注释掉的 也属于没有用到的. 1.进行代码分析操作 2.查看分析结果 3.选择 Unused res ...
- Android ------ 美团的Lint代码检查实践
概述 Lint是Google提供的Android静态代码检查工具,可以扫描并发现代码中潜在的问题,提醒开发人员及早修正,提高代码质量.除了Android原生提供的几百个Lint规则,还可以开发自定义L ...
随机推荐
- 小程序5:FTP程序
目录 1.FTP程序所需要的知识点 2.FTP程序具体实现过程 2.1 FTP程序之注册功能 2.2 FTP程序之登录功能 2.3 FTP程序之下载功能 3.FTP程序源代码 FTP程序所需要的知识点 ...
- 使用Java8中的Optional类来消除代码中的null检查
简介 Optional类是Java 8新增的一个类,Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException). —— 每个 Java 程序员都非常了解的异常 ...
- JDK、JRE与JVM之间的关系
初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧: JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Env ...
- session 机制和 httpsession 详解 (转载)
https://www.cnblogs.com/bjanzhuo/archive/2013/02/27/3575884.html 一.术语session 在我的经验里,session这个词被滥用的程度 ...
- Qt 子窗口监听主窗口信号
Qt 子窗口监听主窗口信号(转载) 原文链接:https://www.cnblogs.com/ybqjymy/p/12169762.html 1 MainWindow *ptr = NULL; 2 ...
- 【Gin-API系列】Gin中间件之异常处理(六)
本文我们介绍生产环境上如何通过捕捉异常recovery来完善程序设计和提高用户体验. Golang异常处理 golang 的异常处理比较简单,通常都是在程序遇到异常崩溃panic之后通过defer调用 ...
- EventDispatcher
事件分发类,提供事件注册.移除.触发功能 采用delegate.dictionary实现 支持自定义事件.事件采用字符串方式标识 支持 0,1,2,3,4 等5种不同参数个数的回调函数 // 路由 ...
- Unity中接收服务器消息并广播事件的实现
最近接触的项目,是一个棋牌游戏,棋牌游戏需要在前端进行一些操作,然后向服务器发送数据包,在服务器接收到客户端的数据后,会在服务端进行一系列的判断之后,然后发送给客户端一个返回数据,客户端接收到这个返回 ...
- Robot Framework自动化测试框架核心指南-如何做好自动化测试平台框架的设计
自动化测试如果需要能高效快速的支撑软件项目的测试,项目的快速迭代以及上线,除了以上我们介绍的需要许多的Lib来支持以及需要高效的去编写自动化测试案例外,还需要一个好的自动化测试框架平台来支撑我们的自动 ...
- 按照BNF语法重新写就的JsonAnalyzer2
本例源码:https://files.cnblogs.com/files/heyang78/JsonAnalyzer2-20200525-01.rar 自从按BNF重新书写了算术表达式解析(https ...