Android中常用的注解 @Retention、@IntDef、@StringDef用法及代表的意思

19 篇文章 1 订阅
17 篇文章 0 订阅

Android中常用的注解

在项目中经常用到注解,但是对一些注解还是一知半解
学习一下注解及代表的含义 @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编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无何种标记,
看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上。


与君共勉

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕氏春秋i

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值