对于Android开发来说,注解可是个好东西,但是利用的不多,我研究过国内不少SDK,发现很少有使用注解的,至于App的开发团队的使用情况不太清楚,但是就我接触的而言,使用的也不多。之前接触过国外的一些SDK,比如facebook相关的一些SDK,你查看一下源码,就会发现,注解是一个很普遍的存在。
注解库
如果你使用了com.android.support:appcompat-v7
库不需要添加额外的依赖。
但是如果你没有使用这个库,也可以额外单独添加注解库。compile 'com.android.support:support-annotations:xx.xx.xx'。
Nullable NonNull
下面举个例子:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test1(null);
test2(null);
}
private void test1(@NonNull String str){
Log.e(this.getClass().getName(),str);
}
private void test2(@Nullable String str){
if (str!=null){
Log.e(this.getClass().getName(),str);
}
}
}
将上面代码放到IDE中,显示效果如下:
我们可以看到test1传入的参数被加重标识出来,如果将鼠标放到上面会有如下显示:
这样,我们可以轻易发现错误,避免空指针的crash发生,养成在每个方法中加注解的习惯,增强代码的严谨性。
资源类型的注解
资源类型的注解,有以下几种:
- @StringRes
- @ColorRes
- @AnimationRes
- @DimensionRes
- @DimensionPixelOffsetRes
- @DimensionPixelSizeRes
- @BooleanRes
- @ColorStateListRes
- @DrawableRes
- @IntArrayRes
- @IntegerRes
- @LayoutRes
- @MovieRes
- @TextRes
- @TextArrayRes
- @StringArrayRes
这些注解在用法上都是一样的,只是标识的类型不一样(不一一介绍了,通过名字就能看出来),下面看一下用法:
private void setText1(@StringRes int id){
}
private void setText2( int id){
}
上面连个方法一个是带资源注解的,一个是不带的,我们在IDE中调用一下,看有什么区别:
从上图中可以看出,加了资源注解的方法,如果传入的资源是错的类型,就会报错,这样更容易发现程序中的bug。
IntDef StringDef
IntDef StringDef可以限制传入参数的内容,这在一些固定参数的方法中尤为重要,比如网络的get post方法:
比如:
private static final int INTGET = 0;
private static final int INTPOST = 1;
private static final String STRGET = "get";
private static final String STRPOST = "post";
然后使用IntDef StringDef定义注解接口
@IntDef({INTGET, INTPOST})
public @interface HttpMethod {
}
@StringDef({STRGET, STRPOST})
public @interface MethodName {
}
public void setMethod(@HttpMethod int httpmethod) {
}
public void setMethod(@MethodName String httpmethod) {
}
这时偶们再调用setMethod方法,会有如下效果:
传入的参数,只能是之前定义的那几个,如果是任意输入的都会提示报错。
权限注解
对于有些方法可能需要系统的一些权限,但是我们会忘了在Manifest中加入这些权限,导致程序报错。这时我们就可以使用权限注解:
@RequiresPermission(Manifest.permission.INTERNET)
private void getDataFromNet(){
}
这时,如果没有这个权限,然后去调用这个方法:
强制super
比如我们写一个基类:
public class Base {
@CallSuper
public void test(){
Log.e("","");
}
}
这时如果我们写一个类,继承这个类,如果不去super父类的方法就会这样:
@keep
一看到这个词肯定第一反应就是跟混淆相关的,没错,这个就是标识该方法被keep出来,当然你也可以在混淆文件中keep,混淆文件的规则可以参考Android混淆机制
总结
基本的注解就总结到这里,使用注解,养成一个良好的代码习惯,可以使代码更加严谨。