美文网首页
使用@IntDef和@StringDef代替Java枚举

使用@IntDef和@StringDef代替Java枚举

作者: 爵小友 | 来源:发表于2017-12-13 11:21 被阅读222次

最近看别人的代码,发现别人使用了@IntDef的注解,便上网搜了一圈记录下来。

定义

Google文档是这样说的

Use the @IntDef and @StringDef annotations so you can create enumerated annotations of integer and string sets to validate other types of code references. Typedef annotations ensure that a particular parameter, return value, or field references a specific set of constants. They also enable code completion to automatically offer the allowed constants.

就是可以通过@IntDef和@StringDef创建枚举注解来验证你的代码引用是否正确,编译器自动检查也会对此校验。

使用

一般我们用静态常量来替代枚举,比如一年四季,一周七天,九大行星,七大洲等这些固定的值:

    public static final int SPRING = 1;
    public static final int SUMMER = 2;
    public static final int AUTUMN = 3;
    public static final int WINTER = 4;

但是这样写有些小问题,设置季节的时候可以设置任意int值,导致程序的健壮性不是很好。所以就引出了枚举:

    enum Season {
        SPRING, SUMMER, AUTUMN, WINTER
    }

这样setSeason()就不会设置成其他值,只能是枚举中的其中一个值。
但是各种Android性能优化告诉我们,尽量少用枚举,枚举消耗的内存比定义成常量更多。(其实少用点枚举也没多大关系,只有在内存紧张的时候才会考虑),因此,谷歌就推出了@IntDef和@StringDef注解。

首先,加入依赖:

compile 'com.android.support:support-annotations:22.0.0'

然后,定义静态常量:

    public static final int SPRING = 1;
    public static final int SUMMER = 2;
    public static final int AUTUMN = 3;
    public static final int WINTER = 4;

为这些常量声明@IntDef:

    @IntDef({SPRING, SUMMER,AUTUMN,WINTER})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Season {}

@Retention是Java里的注解内容,用于指定被修饰的Annotation可以保留多长时间:

  • RetentionPolicy.CLASS 默认值,编译器将把Annotation记录在class文件中。当运行Java程序时,JVM不再保留Annotation。
  • RetentionPolicy.RUNTIME 编译器将把Annotation记录在class文件中。当运行Java程序时,JVM也会保留Annotation。程序可以通过反射获取该Annotation信息。
  • RetentionPolicy.SOURCE Annotation只保留在源代码中,编译器直接丢弃这种Annotation。

接下来我们使用的时候:

    @Season int currentDay ;

    public void setCurrentDay(@Season int currentDay) {
        this.currentDay = currentDay;
    }
 
    @Season
    public int getCurrentDay() {
      return currentDay;
    }

这样就完成了,既不用枚举,常量也不会乱定义的问题。@StringDef用法一样,就是常量定义的是String类型。

参考

相关文章

  • 使用@IntDef和@StringDef代替Java枚举

    最近看别人的代码,发现别人使用了@IntDef的注解,便上网搜了一圈记录下来。 定义 Google文档是这样说的 ...

  • 替代枚举的注解

    Android中新引入的替代枚举的注解有IntDef和StringDef,这里以IntDef做例子说明一下.

  • 性能

    @IntDef替代枚举 @IntDef/@StringDef本身是个Android中提供的一种注解. 添加依赖:c...

  • 注解代替枚举案例 2019-01-25

    title: 注解代替枚举案例 20180312 参考: @IntDef的使用(替代枚举) 使用情形:比如 对 a...

  • 枚举 学习笔记

    android 中 我们通常推荐使用 @IntDef 等 代替使用 枚举,很多同学有疑问,为什么抛弃 枚举。我们现...

  • 浅谈Android中@IntDef注解的使用

    上回书说到Android中推荐使用@IntDef代替枚举类型。 那么今天的主题就是来浅浅的了解一下@IntDef注...

  • 查阅资料

    @IntDef的使用(替代枚举) 注解: java 集合 [https://blog.csdn.net/zhang...

  • Android 常用注解介绍及注解声明

    一、常用注解 开发中经常使用到注解,例如Android自带的 IntDef、StringDef、NonNull、N...

  • android使用IntDef 来代替枚举

    官方的说法就是:我们在写代码的时候要注意类型的使用,以便于提高代码的扩展性和维护性,但是原型的使用一般会付出更多的...

  • @IntDef,@StringDef注解使用-替代Enum

    在android系统的源代码中,可以见到大量的注解,帮助开发者更方便也更规范的使用API接口。常见的注解包括@Ov...

网友评论

      本文标题:使用@IntDef和@StringDef代替Java枚举

      本文链接:https://www.haomeiwen.com/subject/tqjaixtx.html