Android中常用的注解 @Retention、@IntDef、@StringDef

在写项目的时候用到了注解 @Retention@StringDef深刻体会到注解的好处!在此记录一下:

@Retention注解:字面意思是保留

来看下Retention类源码:

package java.lang.annotation;

public enum RetentionPolicy {
    CLASS,
    RUNTIME,
    SOURCE;

    private RetentionPolicy() {
    }
}

看到enum我们就知道,原来是java 5 新增特性枚举类,有人说他是数据类型也没错。因为它是一种特殊的数据类型,
之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了
枚举类型的简洁性、安全性以及便捷性。

好了,下面我们来看下这三个属性CLASS,RUNTIME,SOURCE;

  • CLASS : 编译器要丢弃的注释、被编译器忽略!
  • RUNTIME : 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
  • SOURCE : 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。这是默认的行为。

看完源码官方解析 下面来看下项目中的实战:

Constants类的定义:

    public static final String TAG_DAY_SELECTED = "daySelected";
    public static final String TAG_GOOD_LIFE = "goodLife";
    public static final String TAG_RECOMMEND_BOOK = "recommendBook";

    @Retention(RetentionPolicy.SOURCE) //默认注解

    //这里使用@StringDef来代替Enum枚举。它会帮我检测像Enum枚举一样,在编译时期检查变量的赋值情况!
    @StringDef({TAG_DAY_SELECTED, TAG_GOOD_LIFE, TAG_RECOMMEND_BOOK}) 

    //接口定义和model中的一致
    public @interface HomeTagType {}
    public static final int TYPE_TAG = 1;

在model 中使用
给你想要设置的数据类型 设置一个标记,为了区分:

    //同上面定义的一致
    @Constants.HomeTagType
    private String tag;

    @Constants.HomeTagType
    public String getTag() {
        return tag;
    }

使用注解
3个类型一样的数据 只是显示不同 我没有必要弄3个 只需要弄一个 其他2个用tag做标记 用注解来区分就可以了
这样就可以完美解决 重复造轮子的问题!

 //这里是适配器调用model中的类型
 switch (helper.getItemViewType()) {
             //tag标记
            case Constants.TYPE_TAG:
                switch (item.getTag()) {
                        //注解1
                    case Constants.TAG_DAY_SELECTED:
                        helper.setImageResource(R.id.iv_tag, R.drawable.home_sift);
                        break;
                         //注解2
                    case Constants.TAG_GOOD_LIFE:
                        helper.setImageResource(R.id.iv_tag, R.drawable.home_life);
                        break;
                         //注解3
                    case Constants.TAG_RECOMMEND_BOOK:
                        helper.setImageResource(R.id.iv_tag, R.drawable.booking_recommend);
                        break;
                }
                break;

            case Constants.TYPE_GOODS_TITLE:
              ...  

依赖

dependencies {
  implementation fileTree(include: ['*.jar'], dir: 'libs')
    androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'

        //support libs
            ...
    })
总结:

注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,没有加,则等于没有任何标记
以后,javac编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无何种标记,
看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上。


与君共勉

我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Life_s/article/details/81347513
今日推荐