上回書(shū)說(shuō)到Android中推薦使用@IntDef代替枚舉類(lèi)型。 那么今天的主題就是來(lái)淺淺的了解一下@IntDef注解的使用怔鳖。
在build.gradle 文件中添加依賴(lài)
implementation 'com.android.support:support-annotations:26.1.0'
定義自己的@IntDef注解類(lèi)型
@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類(lèi)型的值范圍。
@Retention(RetentionPolicy.CLASS) 為元注解乒验,什么是元注解呢俄认?
元注解就是用來(lái)注解注解類(lèi)型的注解:)
理解了這句話,就理解了注解類(lèi)型蒙揣,哈哈靶溜。
JDK中提供了如下幾種常用的元注解:
-
@Documented
表示含有該注解類(lèi)型的元素(帶有注釋的)會(huì)通過(guò)javadoc或類(lèi)似工具進(jìn)行文檔化 -
@Inherited
表示注解類(lèi)型能被自動(dòng)繼承 -
@Retention
表示注解類(lèi)型的存活時(shí)長(zhǎng) -
@Target
表示注解類(lèi)型所適用的程序元素的種類(lèi) -
@Repeatable
使被修飾的注解可以重復(fù)的注解某一個(gè)程序元素
如果你對(duì)注解類(lèi)型還不了解或者對(duì)這些元注解的用法不了解的話,可以參考這篇秒懂:
秒懂JAVA注解類(lèi)型
在定義了自己的IntDef注解類(lèi)型后懒震,你就可以用它來(lái)修飾方法參數(shù)罩息、方法返回值
就像下面這樣:
@RenderPosition
private int calculateRenderPosition(Rect faceRect) {
....
return RenderPosition.UP;
}
也可以作為switch-case的變量類(lèi)型,像這樣:
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
這樣就完成了瓷炮,既不用枚舉,也實(shí)現(xiàn)了編譯期的類(lèi)型檢查递宅,同時(shí)還避免了只定義靜態(tài)常量帶來(lái)的語(yǔ)義模糊的問(wèn)題娘香。
是不是很棒?