Toast中@Duration注解的使用

1蚁署、duration 屬性

代碼原型是這樣的:

public static Toast makeText(Context context, CharSequence text, @Duration int duration) {

下面這段代碼是使用 Toast 的示例代碼

//下面是兩個顯示時間的常量
public static final int LENGTH_SHORT = 0;
public static final int LENGTH_LONG = 1;

Toast.makeText(context,"toast message",Toast.LENGTH_SHORT).show();

假如用這種方式編寫:

//直接使用 0 表示 LENGTH_SHORT  可以嗎
Toast.makeText(context,"toast message",0).show();

假如使用 0 來表示 LENGTH_SHORT 的話蹋肮, AS 就直接報錯了炸客,提示信息在截圖中可以看出,顯示這個值必須是 Toast.LENGTH_LONG/LENGTH_SHORT 兩個之一莽鸭。

Toast.png

2荤懂、@Duration的使用

在上面 makeText 中的第三個參數(shù) duration 中添加了一個 @Duration 的東東,就是這個注解約束了duration變量的賦值顶伞。

@IntDef({LENGTH_SHORT, LENGTH_LONG})
@Retention(RetentionPolicy.SOURCE)
public @interface Duration {}

3饵撑、 @IntDef

@IntDef 表示定義該注解 Duration 元素類型為 long 類型剑梳,并且只能取這兩個值,LENGTH_SHORT, LENGTH_LONG滑潘,這兩個值就是 Toast 的常量了垢乙,分別表示0和1。

//該注解標注的信息會保留到編譯時期
@Retention(SOURCE)
//可用于類语卤,接口(包括注解接口)還有枚舉
@Target({ANNOTATION_TYPE})
public @interface IntDef {
    /** Defines the allowed constants for this element */
    //定義 long 型常量
    long[] value() default {};

    /** Defines whether the constants can be used as a flag, or just as an enum (the default) */
    boolean flag() default false;
}

使用示例

@IntDef({LENGTH_SHORT, LENGTH_LONG})
@Retention(RetentionPolicy.SOURCE)
public @interface Duration {}

4追逮、@StringDef

除了 @IntDef 之外還有 @StringDef ,表示該注解的元素類型為 String 類型粹舵,并且所取的值就在 StringDef 規(guī)定范圍內(nèi)钮孵。在系統(tǒng)提供的 API 中也有體現(xiàn),那就是 Context#getSystemService(@ServiceName @NonNull String name); ServiceName 就是使用 @StringDef 的注解眼滤。

//該注解標注的信息會保留到編譯時期
@Retention(SOURCE)
//可用于類巴席,接口(包括注解接口)還有枚舉
@Target({ANNOTATION_TYPE})
public @interface StringDef {
    /** Defines the allowed constants for this element */
    String[] value() default {};
}

使用示例

//定義
@Retention(RetentionPolicy.SOURCE)
@StringDef({POWER_SERVICE,WINDOW_SERVICE,LAYOUT_INFLATER_SERVICE})
public @interface ServiceName {
    public static final String POWER_SERVICE = "power";
    public static final String WINDOW_SERVICE = "window";
    public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater";
}

//使用
public abstract Object getSystemService(@ServiceName String name);

5、使用場景

當某些參數(shù)的值需要是固定的值時诅需,那么就可以使用 @StringDef
或者@IntDef (目前只發(fā)現(xiàn)了這兩種)去標識漾唉,例如系統(tǒng)提供的 Toast 就使用了 @Duration 注解,它是使用 @IntDef 去限制 duration 變量的設(shè)置堰塌,而 Context 中的 getSystemService 中的 name 變量就是使用 @ServiceName 去標識的,該注解就使用使用 @StringDef 去限制 name 的取值赵刑。

我感覺這種做法有點像枚舉的做法。

我們注意到系統(tǒng)提供的這兩個注解的定義:

@Retention(RetentionPolicy.SOURCE)

它們都是用 RetentionPolicy.SOURCE 標識的场刑,它標識該注解的信息不會被編譯般此,會被編譯器拋棄,也就是在編譯前就知道是否發(fā)生了錯誤牵现,既然不會被編譯铐懊,也就無法被加載到 JVM 中了。

@IntDef 和 @StringDef 可以像枚舉一樣在變量的賦值時做一些約束操作施籍,相對比在類中定義一些常量來說居扒,這種方式更加集中同時也實現(xiàn)了類型安全。

6丑慎、使用@String自己定一個 @FlagColor

事先說明,這個 demo 并沒有實際意義瓤摧,只是對模仿 @Duraiton 來寫的一個 demo 而已竿裂。

  • 模仿 @Duration 自己定義一個 FlagDemo 類

    1.定義需要約束的幾個常量
    2.定義注解類FlagColor,使用@StringDef限定上面定義的常量
    3.在提供的一些方法使用@FlagColor注解進行傳參和返回值的約束照弥。

public class FlagDemo {

    public final static String RED = "red";
    public final static String GREEN = "green";
    public final static String YELLO = "yello";


    private String color;

    //定義枚舉
    @Retention(RetentionPolicy.RUNTIME)
    @StringDef({RED, GREEN, YELLO})
    public @interface FlagColor {
    }


    public String setColor(@FlagColor String color) {
        return this.color = color;
    }

    @FlagColor
    public String getColor() {
        return color;
    }
}

  • 測試

注意這里 flagDemo.setColor("") 報錯腻异,報錯結(jié)果跟上面 duration 參數(shù)傳入 0 一樣的,也就是說我們自己定義的 @FlagColor 可以正常使用的这揣。

public static final void main(String[] args) {
    FlagDemo flagDemo = new FlagDemo();
    //flagDemo.setColor("");
    flagDemo.setColor(FlagDemo.GREEN);
    System.out.println("color:"+flagDemo.getColor());
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悔常,一起剝皮案震驚了整個濱河市影斑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌机打,老刑警劉巖矫户,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異残邀,居然都是意外死亡皆辽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門芥挣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驱闷,“玉大人,你說我怎么就攤上這事空免】樟恚” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵蹋砚,是天一觀的道長扼菠。 經(jīng)常有香客問我,道長都弹,這世上最難降的妖魔是什么娇豫? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮畅厢,結(jié)果婚禮上冯痢,老公的妹妹穿的比我還像新娘。我一直安慰自己框杜,他們只是感情好浦楣,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咪辱,像睡著了一般振劳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上油狂,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天历恐,我揣著相機與錄音,去河邊找鬼专筷。 笑死弱贼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的磷蛹。 我是一名探鬼主播吮旅,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼味咳!你這毒婦竟也來了庇勃?” 一聲冷哼從身側(cè)響起檬嘀,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎责嚷,沒想到半個月后鸳兽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡再层,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年贸铜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聂受。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒿秦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛋济,到底是詐尸還是另有隱情棍鳖,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布碗旅,位于F島的核電站渡处,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祟辟。R本人自食惡果不足惜医瘫,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旧困。 院中可真熱鬧醇份,春花似錦、人聲如沸吼具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拗盒。三九已至怖竭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陡蝇,已是汗流浹背痊臭。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留登夫,地道東北人趣兄。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像悼嫉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拼窥,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理戏蔑,服務發(fā)現(xiàn)蹋凝,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 轉(zhuǎn)自:http://ocnyang.com/2016/12/28/SupportAnnotations/在 And...
    譚冉冉閱讀 1,091評論 1 49
  • //得到圖片的鏈接NSString *urlString=dic[@"thumbURL"];//加載網(wǎng)絡圖片[ce...
    傲骨天成科技閱讀 184評論 0 0
  • 昨天又下鄉(xiāng)总棵,晚上到土左鳍寂,一天沒治了,今天上午孩子上課也沒治療情龄,這段時間的治療不太連續(xù)迄汛,平均每天也就是一次。昨天開始...
    王學峰shui閱讀 231評論 0 0
  • 其實吧骤视,反饋這玩意兒 我一直覺得挺玄幻的 之前說了鞍爱,茉特這個牌子,我觀察了一年多 一年专酗,每天都會看到各種反饋睹逃,對比...
    白星醬閱讀 239評論 0 0