上回书说到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
这样就完成了,既不用枚举,也实现了编译期的类型检查,同时还避免了只定义静态常量带来的语义模糊的问题。
是不是很棒?
网友评论