Android Support Annotations

在Android Support Library19.1版本中治筒,Android工具小組引入了幾個(gè)很酷的注解類型,供開發(fā)者在工程中使用股缸。Support Library自身也使用這些注解,這是一個(gè)好兆頭。就讓我們好好研究下歇僧。 通過gradle可以很容易的把這些注解添加到我們的工程中:

compile 'com.android.support:support-annotations:20.0.0'

有三種類型的注解可供我們使用:

  • Nullness注解;
  • 資源類型注解锋拖;
  • IntDef和StringDef注解诈悍;

我們將通過代碼例子來講解每一種類型的作用以及在工程中如何使用它們。

Nullness注解

使用@NonNull注解修飾的參數(shù)不能為null兽埃。在下面的代碼例子中侥钳,我們有一個(gè)取值為null的name變量,它被作為參數(shù)傳遞給sayHello函數(shù)柄错,而該函數(shù)要求這個(gè)參數(shù)是非null的String類型:

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    String name = null;

    sayHello(name);
}


void sayHello(@NonNull String s) {
    Toast.makeText(this, "Hello " + s, Toast.LENGTH_LONG).show();
}
}

由于代碼中參數(shù)String s使用@NonNull注解修飾舷夺,因此IDE將會(huì)以警告的形式提醒我們這個(gè)地方有問題:



如果我們給name賦值苦酱,例如String name = “Our Lord Duarte”,那么警告將消失给猾。使用@Nullable注解修飾的函數(shù)參數(shù)或者返回值可以為null躏啰。假設(shè)User類有一個(gè)名為name的變量,使用User.getName()訪問耙册,那么我們可以編寫如下代碼:

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    User user = new User("Our Lord Duarte");

    Toast.makeText(this, "Hello " + getName(user), Toast.LENGTH_LONG).show();
}

@Nullable
String getName(@NonNull User user) {
    return user.getName();
}
  }

因?yàn)間etName函數(shù)的返回值使用@Nullable修飾给僵,所以調(diào)用:

Toast.makeText(this, "Hello " + getName(user), Toast.LENGTH_LONG).show();

沒有檢查getName的返回值是否為空,將可能導(dǎo)致crash详拙。

資源類型注解

是否曾經(jīng)傳遞了錯(cuò)誤的資源整型值給函數(shù)帝际,還能夠愉快的得到本來想要的整型值嗎?資源類型注解可以幫助我們準(zhǔn)確實(shí)現(xiàn)這一點(diǎn)饶辙。在下面的代碼中蹲诀,我們的sayHello函數(shù)預(yù)期接受一個(gè)字符串類型的id,并使用@StringRes注解修飾:

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    sayHello(R.style.AppTheme);
}


void sayHello(@StringRes int id) {
    Toast.makeText(this, "Hello " + getString(id), Toast.LENGTH_LONG).show();
}
}

而我們傳遞了一個(gè)樣式資源id給它弃揽,這時(shí)IDE將提示警告如下:



類似的脯爪,我們把警告的地方使用一個(gè)字符串資源id代替警告就消失了:

sayHello(R.string.name);

IntDef和StringDef注解

我們要介紹的最后一種類型的注解是基于Intellij的“魔術(shù)常量”檢查機(jī)制(http://blog.jetbrains.com/idea/2012/02/new-magic-constant-inspection/) (我們不需要詳細(xì)了解這個(gè)機(jī)制具體是如何實(shí)現(xiàn)的,想了解的話可以點(diǎn)擊鏈接)矿微。

很多時(shí)候痕慢,我們使用整型常量代替枚舉類型(性能考慮),例如我們有一個(gè)IceCreamFlavourManager類涌矢,它具有三種模式的操作:VANILLA掖举,CHOCOLATE和STRAWBERRY。我們可以定義一個(gè)名為@Flavour的新注解娜庇,并使用@IntDef指定它可以接受的值類型塔次。

public class IceCreamFlavourManager {

private int flavour;

public static final int VANILLA = 0;
public static final int CHOCOLATE = 1;
public static final int STRAWBERRY = 2;

@IntDef({VANILLA, CHOCOLATE, STRAWBERRY})
public @interface Flavour {
}

@Flavour
public int getFlavour() {
    return flavour;
}

public void setFlavour(@Flavour int flavour) {
    this.flavour = flavour;
}
}

這時(shí)如果我們使用錯(cuò)誤的整型值調(diào)用IceCreamFlavourManager.setFlavour時(shí),IDE將報(bào)錯(cuò)如下:


IDE甚至?xí)崾疚覀兛梢允褂玫挠行У娜≈担?/p>


我們也可以指定整型值作為標(biāo)志位名秀,也就是說這些整型值可以使用’|’或者’&’進(jìn)行與或等操作励负。如果我們把@Flavour定義為如下標(biāo)志位:

@IntDef(flag = true, value = {VANILLA, CHOCOLATE, STRAWBERRY})
public @interface Flavour {
}

那么可以如下調(diào)用:

iceCreamFlavourManager.setFlavour(IceCreamFlavourManager.VANILLA & IceCreamFlavourManager
            .CHOCOLATE);

StringDef用法和@IntDef基本差不多,只不過是針對(duì)String類型而已匕得。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末继榆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子耗跛,更是在濱河造成了極大的恐慌裕照,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件调塌,死亡現(xiàn)場(chǎng)離奇詭異晋南,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)羔砾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門负间,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偶妖,“玉大人,你說我怎么就攤上這事政溃≈悍茫” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵董虱,是天一觀的道長扼鞋。 經(jīng)常有香客問我,道長愤诱,這世上最難降的妖魔是什么云头? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮淫半,結(jié)果婚禮上溃槐,老公的妹妹穿的比我還像新娘。我一直安慰自己科吭,他們只是感情好昏滴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著对人,像睡著了一般谣殊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上规伐,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天蟹倾,我揣著相機(jī)與錄音,去河邊找鬼猖闪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛肌厨,可吹牛的內(nèi)容都是我干的培慌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼柑爸,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼吵护!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起表鳍,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤馅而,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后譬圣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓮恭,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年厘熟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屯蹦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片维哈。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖登澜,靈堂內(nèi)的尸體忽然破棺而出阔挠,到底是詐尸還是另有隱情,我是刑警寧澤脑蠕,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布购撼,位于F島的核電站,受9級(jí)特大地震影響谴仙,放射性物質(zhì)發(fā)生泄漏迂求。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一狞甚、第九天 我趴在偏房一處隱蔽的房頂上張望锁摔。 院中可真熱鬧,春花似錦哼审、人聲如沸谐腰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽十气。三九已至,卻和暖如春春霍,著一層夾襖步出監(jiān)牢的瞬間砸西,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工址儒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芹枷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓莲趣,卻偏偏與公主長得像鸳慈,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喧伞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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