前言
你肯定写过,ViewGroup.setGravity(int gravity),但是Ctrl+Alt+空格,又没有直接提示,如果不看方法注释根本不知道应该放什么值。Google的Api还好,大多数都有注释说明,但是我们项目的代码,可不是每个人都写注释,而且很简单的一个设值方法,大多数时候都懒得写,那别人用的时候就不知道你要填什么样的值了。有没有Ctrl+Alt+空格能直接得到想要的提示值呢,就跟View.setVisibility()一样,而且输入其他非指定的值,ide还会报错告诉你。答案当然有了,你稍微看一下源码也能一目了然,没错就是用了注解。
枚举类型
通常需要限定传入参数时候,还有另外一种方式,就是Enum,枚举类型。但是,在Android中,Enum会产生过更多的开销,而且会导致dex文件占用更多空间,Google也推荐使用注解类型去代替,Enum用于常量or类型限制这种使用方式。开启Proguarad的优化会对有Enum有优化,将转换的Enum为Integer类型。
Google链接
Avoid enumerations
A single enum can add about 1.0 to 1.4 KB of size to your app's
classes.dex
file. These additions can quickly accumulate for complex systems or shared libraries. If possible, consider using the@IntDef
annotation and ProGuardto strip enumerations out and convert them to integers. This type conversion preserves all of the type safety benefits of enums.
The price of ENUMs (Youtobe)
这个视频还明确的对比使用Enum及普通常量的花销差距。dex占用空间花销13倍,内存花销多20字节。
代码检查
跟Enum对比,除了保持花销不变,还支持Lint错误检测,确保代码构建安全,即防止传入不正确的变量。
注解类型
-
Nullness 注解
@Nullable,即可为null
@Nonnull,即不可为空 -
资源注解
@AnimRes 动画
@ColorRes 颜色资源类型
@IdRes 资源id
@InterpolatorRes 动画插值器
@IntDef 整形
@LayoutRes layout资源
@StringRes 字符串资源 -
线程注解
@UiThread: UI线程
@MainThread :主线程
@WorkerThread: 子线程
@BinderThread : 绑定线程 -
值约束注解
@Size 以检查集合或数组的大小,以及字符串的长度
@IntRange int范围约束
@FloatRange float范围约束 -
权限注解
@RequiresPermission 要求权限,这个在android的api都有遇到过
Android提供的注解太多,只说一些常用的,这里不一一介绍。文章末尾会提供链接,去看官方介绍更加详细、准确、权威。
使用
以@Intdef为例。
//声明
public static final int SHAPE_CIRCLE = 0x21;
public static final int SHAPE_OVAL = 0x22;
public static final int SHAPE_RECT = 0x23;
@IntDef({SHAPE_CIRCLE, SHAPE_OVAL, SHAPE_RECT})
@interface Shape {
}
//成员变量中使用
@HiGuide.Shape
private int mShape;
//参数中使用
public void setShape(@Shape int shape){
mShape = shape;
}
//返回值中使用、对方法使用
@WorkerThread
@HiGuide.Shape
public int getShape() {
return mShape;
}
//还有一个优势就是,在使用switch语句的时候,可以Alt+回车直接生成对应case,不用一个个写。
最后
本文的初衷就是,对自己关于这一块的总结。参考着Google官网的介绍,才发现,没必要全部说,如果这样还不如直接让读者去官网看,所以,本文仅作为一个引子,说下优势,及好处。更多的使用方式,可以去官网及国内博客了解更多。为了方便,下面放出官网链接,及推荐一篇国内的,好方便以后查看。
Android Developer -使用注解进行代码检查 (Google已经有中文翻译哦)
Android Api文档 - Annotaion
CSDN - Android 注解类型
网友评论