美文网首页
浅谈Android中@IntDef注解的使用

浅谈Android中@IntDef注解的使用

作者: 汪和呆喵 | 来源:发表于2018-12-21 22:40 被阅读0次

    上回书说到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

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

    是不是很棒?

    相关文章

      网友评论

          本文标题:浅谈Android中@IntDef注解的使用

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