深入淺出Android Support Annotations

原文鏈接:http://anupcowkur.com/posts/a-look-at-android-support-annotations/
在Android Support Library19.1版本中,Android工具小組引入了幾個很酷的注解類型女气,供開發(fā)者在工程中使用归园。Support Library自身也使用這些注解,這是一個好兆頭字柠。就讓我們好好研究下。 通過gradle可以很容易的把這些注解添加到我們的工程中:

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

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

  • Nullness注解;

  • 資源類型注解庇忌;

  • IntDef和StringDef注解义屏;

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

Nullness注解

使用@NonNull注解修飾的參數(shù)不能為null。在下面的代碼例子中闽铐,我們有一個取值為null的name變量蝶怔,它被作為參數(shù)傳遞給sayHello函數(shù),而該函數(shù)要求這個參數(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將會以警告的形式提醒我們這個地方有問題:



如果我們給name賦值添谊,例如String name = “Our Lord Duarte”,那么警告將消失察迟。使用@Nullable注解修飾的函數(shù)參數(shù)或者返回值可以為null斩狱。假設(shè)User類有一個名為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();
    }

}

因為getName函數(shù)的返回值使用@Nullable修飾所踊,所以調(diào)用:
Toast.makeText(this, "Hello " + getName(user), Toast.LENGTH_LONG).show();

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

資源類型注解

是否曾經(jīng)傳遞了錯誤的資源整型值給函數(shù)秕岛,還能夠愉快的得到本來想要的整型值嗎?資源類型注解可以幫助我們準確實現(xiàn)這一點误证。在下面的代碼中继薛,我們的sayHello函數(shù)預(yù)期接受一個字符串類型的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();
    }

}

而我們傳遞了一個樣式資源id給它愈捅,這時IDE將提示警告如下:



類似的遏考,我們把警告的地方使用一個字符串資源id代替警告就消失了:

sayHello(R.string.name);

IntDef和StringDef注解

我們要介紹的最后一種類型的注解是基于Intellij的“魔術(shù)常量”檢查機制(http://blog.jetbrains.com/idea/2012/02/new-magic-constant-inspection/) (我們不需要詳細了解這個機制具體是如何實現(xiàn)的,想了解的話可以點擊鏈接)蓝谨。
很多時候灌具,我們使用整型常量代替枚舉類型(性能考慮),例如我們有一個IceCreamFlavourManager類譬巫,它具有三種模式的操作:VANILLA咖楣,CHOCOLATE和STRAWBERRY。我們可以定義一個名為@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;
    }

}

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



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


我們也可以指定整型值作為標志位咕缎,也就是說這些整型值可以使用’|’或者’&’進行與或等操作瘪松。如果我們把@Flavour定義為如下標志位:
@IntDef(flag = true, value = {VANILLA, CHOCOLATE, STRAWBERRY})
    public @interface Flavour {
    }

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

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

@StringDef用法和@IntDef基本差不多咸作,只不過是針對String類型而已。
關(guān)于將來計劃增加哪些新的注解類型或者這些注解的依賴以及和Intellij自身的注解如何交互等等問題宵睦,可以查看網(wǎng)址:http://tools.android.com/tech-docs/support-annotations记罚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市壳嚎,隨后出現(xiàn)的幾起案子桐智,更是在濱河造成了極大的恐慌,老刑警劉巖烟馅,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件说庭,死亡現(xiàn)場離奇詭異,居然都是意外死亡郑趁,警方通過查閱死者的電腦和手機刊驴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寡润,“玉大人捆憎,你說我怎么就攤上這事∷笪疲” “怎么了躲惰?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長变抽。 經(jīng)常有香客問我础拨,道長,這世上最難降的妖魔是什么绍载? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任诡宗,我火速辦了婚禮,結(jié)果婚禮上击儡,老公的妹妹穿的比我還像新娘塔沃。我一直安慰自己,他們只是感情好曙痘,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著立肘,像睡著了一般边坤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谅年,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天茧痒,我揣著相機與錄音,去河邊找鬼融蹂。 笑死旺订,一個胖子當著我的面吹牛弄企,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播区拳,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼拘领,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了樱调?” 一聲冷哼從身側(cè)響起约素,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笆凌,沒想到半個月后圣猎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡乞而,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年送悔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爪模。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡欠啤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呻右,到底是詐尸還是另有隱情跪妥,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布声滥,位于F島的核電站眉撵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏落塑。R本人自食惡果不足惜纽疟,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憾赁。 院中可真熱鬧污朽,春花似錦、人聲如沸龙考。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晦款。三九已至炎功,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缓溅,已是汗流浹背蛇损。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淤齐。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓股囊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親更啄。 傳聞我的和親對象是個殘疾皇子稚疹,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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