浅谈Android中@IntDef注解的使用

1,814 阅读1分钟

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

在build.gradle 文件中添加依赖 implementation 'com.android.support:support-annotations:26.1.0'

定义自己的@IntDef注解类型

@IntDef ({
        LEFT_UP, LEFT_DOWN,
        RIGHT_UP, RIGHT_DOWN,
        UP, DOWN
})
@Retention(RetentionPolicy.CLASS)
public @interface RenderPosition {
    int LEFT_UP = 0;
    int LEFT_DOWN = 1;
    int RIGHT_UP = 2;
    int RIGHT_DOWN = 3;
    int UP = 4;
    int DOWN = 5;
}

@IntDef限定了 RenderPosition类型的值范围。 @Retention(RetentionPolicy.CLASS) 为元注解,什么是元注解呢? 元注解就是用来注解注解类型的注解:) 理解了这句话,就理解了注解类型,哈哈。

JDK中提供了如下几种常用的元注解

  • @Documented 表示含有该注解类型的元素(带有注释的)会通过javadoc或类似工具进行文档化
  • @Inherited 表示注解类型能被自动继承
  • @Retention 表示注解类型的存活时长
  • @Target 表示注解类型所适用的程序元素的种类
  • @Repeatable 使被修饰的注解可以重复的注解某一个程序元素

如果你对注解类型还不了解或者对这些元注解的用法不了解的话,可以参考这篇秒懂: 秒懂JAVA注解类型

在定义了自己的IntDef注解类型后,你就可以用它来修饰方法参数、方法返回值 就像下面这样:

        @RenderPosition
        private int calculateRenderPosition(Rect faceRect) {
            ....
            return RenderPosition.UP;
        }

也可以作为switch-case的变量类型,像这样:

        private Rect calculateBackgroundRect(Rect faceRect) {
            @RenderPosition int renderPostion = calculateRenderPosition(faceRect);
            Rect backgroundRect = new Rect();
            switch (renderPostion) {
                case RenderPosition.UP:
                    ...
                    break;
                case RenderPosition.DOWN:
                    ...
                    break;
                case RenderPosition.LEFT_UP:
                    ...
                    break;
                case RenderPosition.RIGHT_UP:
                    ...
                    break;
                case RenderPosition.LEFT_DOWN:
                    ...
                    break;
                case RenderPosition.RIGHT_DOWN:
                    ...
                    break;
            }
            return backgroundRect;
        }

同理,我们也可以使用@StringDef

这样就完成了,既不用枚举,也实现了编译期的类型检查,同时还避免了只定义静态常量带来的语义模糊的问题

是不是很棒?