鉴于移动端对性能的要求,能够让程序更加直接明了的enum关键字一般不建议在app中使用,可是全部使用一些调用方法时没有明确对类型做要求的“magic number”的话,程序的可读性相对较差。庆幸的是,Google针对这个方面做了一些类库支持,采用注解的(Source级别)方式来规范代码,在编译期产生编译错误来避免bug,增加程序的可读性。
有哪些比较实用的注解值得学习呢?先看一个例子:
Toast.makeText(mContext,"hello world!",1234).show();
没有annotation包时,上述代码是能够正确编译正常运行的,在引入annotation包以后,不用常量Toast.LENGTH_LONG Toast.LENGTH_SHORT的话是无法通过编译的,我们跟进代码看,发现Toast类的makeText()方法做了一些改动,在参数列表的int duration项增加了一项注解,如下:
public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
Toast result = new Toast(context);
...
return result;
}
学习一下@Duration的实现:
private static final int SUNDAY = 0;
private static final int MONDAY = 1;
private static final int TUESDAY = 2;
private static final int THURSDAY = 3;
private static final int WEDNESDAY = 4;
private static final int FRIDAY = 5;
private static final int SATURDAY = 6;
@IntDef({SUNDAY, MONDAY, TUESDAY, THURSDAY, WEDNESDAY, FRIDAY, SATURDAY})
@Retention(RetentionPolicy.SOURCE)
@interface Weekdays {
}
int currentWeekday;
public void setCurWeekday(@Weekdays int weekday){
//....
}
以上,就使得如果调用setCurweekday方法传入的不是@IntDef注解中参数列表中其中之一的话,在不能通过编译器的编译。
@StringDef 也是同样的用法,只是换成了String类型。
22个资源类注解:
- AnimatorRes :指出一个integer的参数,成员变量,或方法返回值是一个animator资源的引用。
- AnimRes:指出一个integer的参数,成员变量,或方法返回值是一个anim资源的引用。
- AnyRes:指出一个integer的参数,成员变量,或方法返回值是一个任意资源类型的引用。
- ArrayRes:指出一个integer的参数,成员变量,或方法返回值是一个array资源类型的引用。
- AttrRes:指出一个integer的参数,成员变量,或方法返回值是一个attr资源的引用。
- BoolRes:指出一个integer的参数,成员变量,或方法返回值是一个boolean资源的引用。
- ColorRes:指出一个integer的参数,成员变量,或方法返回值是一个color资源的引用。
- DimenRes:指出一个integer的参数,成员变量,或方法返回值是一个dimen资源的引用。
- DrawableRes:指出一个integer的参数,成员变量,或方法返回值是一个drawable资源的引用(包括@mipmap)。
- FractionRes:指出一个integer的参数,成员变量,或方法返回值是一个fraction资源的引用。
- IdRes:指出一个integer的参数,成员变量,或方法返回值是一个id资源的引用。
- IntegerRes:指出一个integer的参数,成员变量,或方法返回值是一个integer资源的引用。
- InterpolatorRes:指出一个integer的参数,成员变量,或方法返回值是一个interpolator资源的引用。
- LayoutRes:指出一个integer的参数,成员变量,或方法返回值是一个layout资源的引用。
- MenuRes:指出一个integer的参数,成员变量,或方法返回值是一个menu资源的引用。
- PluralsRes:指出一个integer的参数,成员变量,或方法返回值是一个plurals资源的引用。
- RawRes:指出一个integer的参数,成员变量,或方法返回值是一个raw资源的引用。
- StringRes:指出一个integer的参数,成员变量,或方法返回值是一个string资源的引用。
- StyleableRes:指出一个integer的参数,成员变量,或方法返回值是一个styleable资源的引用。
- StyleRes:指出一个integer的参数,成员变量,或方法返回值是一个style资源的引用。
- TransitionRes:指出一个integer的参数,成员变量,或方法返回值是一个transition资源的引用。
XmlRes:指出一个integer的参数,成员变量,或方法返回值是一个xml资源的引用。
颜色注解:假如我们定义了一个方法用来设置颜色,但是因为表示颜色用的是int类型,这样就会导致使用的人无法区分是要传一个表示颜色的资源还是颜色值,对于这种情况,support-annotations给我们提供了以下这个注解:
ColorInt:指出一个被注解的元素,是一个int颜色值,表示的是AARRGGBB。
4个线程相关的注解:
- BinderThread:指出被注解的方法应该只在binder线程中被调用。
- MainThread:指出被注解的方法应该只在主线程中被调用。
- WorkerThread:指出被注解的方法应该只在工作线程中被调用。
- UiThread:指出被注解的方法应该只在UI线程中被调用。
关于这四个注解的差异,可参见stackoverflow的回答:Difference between MainThread, UiThread, WorkerThread, BinderThread in Android Annotation
其他方法相关的注解:
- CallSuper:指出一个方法如果被重写了,它必须也被调用。比如Activity的生命周期方法onCreate方法等。
- CheckResult:指出一个方法返回的结果通常是否为一个忽略的错误。比如删除文件:new File(“xx”).delete();
- Keep:指出一个方法在被混淆的时候应该被保留。
取值范围的注解:
FloatRange:指出一个被注解的元素应该是一个给定范围内的float值或double值。比如:
@FloatRange(from=0.0,to=1.0)
public float getAlpha() {
...
}
IntRange:指出一个被注解的元素应该是一个给定范围内的int值或long值。
IntDef:指出一个int类型的元素,它表示的是一个逻辑上的类型,并且它的值必须是被明确声明的常量之一。官方常使用这种方式使int类型代替enum类型。
StringDef:指出一个String类型的元素,它表示的是一个逻辑上的类型,并且它的值必须是被明确声明的常量之一。
空指针检查
通常我们如果对一个变量进行主动的赋值为null,编译器可能会进行可能引发空指针异常的警告,我们可以使用以下注解对这种行为进行控制。
* NonNull:指出一个参数,变量,或方法返回值永远不可为null。
* Nullable:指出一个参数,变量,或方法返回值可能为null。
其他注解:
- Size:表示一个被注解的元素应该有一个给定的大小或长度。
- VisibleForTesting:可注解一个类,方法,或变量,表示有更宽松的可见性,这样它能够有更宽泛的可见性,使代码可以被测试。
部分总结转载自:http://blog.csdn.net/maosidiaoxian/article/details/50452706