【Android】Android Support Annotations

#Android Support Annotationsjava

查看原文android

在Support Library 19.1以及之後的版本中,Android工具小組引入了幾個很酷的註解類型,方便開發者在工程中使用,同時Support Library自身也使用了這些註解。ide

本文的代碼都使用android studio完成。首先,添加註解支持:工具

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

有三種類型的註解:post

  1. NonNull & Nullable
  2. 資源Id
  3. IntDef & StringDef

##Nullness註解 @NonNull 用來修飾不能爲null的參數。在下面的代碼例子中,咱們有一個取值爲 null 的 name 變量,它被做爲參數傳遞給 sayHello 方法,而該方法要求這個參數是非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 name) {
        Toast.makeText(this, "Hello " + s, Toast.LENGTH_LONG).show();
    }

}

因爲代碼中參數 name 被 @NonNull 註解修飾,所以 android studio 將會以警告的形式提醒咱們這個地方有問題:this

name_is_null_warning

若是咱們給 name 賦值,例如idea

String name = 「Our Lord Duarte」

那麼警告將消失。code

【注:這個我試了一下,在android studio裏面,就算不用註解,也會有提示的,android studio 就是這麼智能。】blog

@Nullable 用來修飾方法的參數或者返回值可能爲 null。示例以下:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this, getName().toLowerCase(), Toast.LENGTH_LONG).show();
    }

    @Nullable
    String getName() {
        return "";
    }

}

由於 getName 方法的返回值使用 @Nullable 修飾,因此 android studio 會提示

Method invocation "getName().toLowerCase()" may produce "java.lang.NollPointerException"

##資源註解

資源類型註解能夠幫助咱們準確的使用資源id,例如,避免咱們在要求colorId的地方錯誤的使用了dimenId。 在下面的代碼中,咱們的sayHello方法預期接受一個字符串類型的資源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,與預期的字符串資源Id不符合,這時IDE將提示警告以下:

wrong_resource_type_error

相似的,咱們把警告的地方使用一個字符串資源Id代替警告就消失了:

sayHello(R.string.name);

基本上,每一種資源類型都有相應的資源註解

AnimatorRes
AnimRes
AnyRes
ArrayRes
AttrRes
BoolRes
ColorRes
DimenRes
DrawableRes
FractionRes
IdRes
IntegerRes
InterpolatorRes
LayoutRes
MenuRes
PluralsRes
RawRes
StringRes
StyleableRes
StyleRes
XmlRes

##IntDef和StringDef註解

最後一種類型的註解是基於Intellij的「魔數」檢查機制功能

【注:「魔數」就是那些不能看出有什麼含義的數字常量,這裏也包括字符串常量】

不少時候,出於性能的考慮,咱們會使用整型常量代替枚舉類型。例如咱們有一個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;
    }
}

這時若是咱們使用直接字面量來調用IceCreamFlavourManager.setFlavour,IDE將提示錯誤以下:

wrong_flavour_error

IDE甚至會提示咱們能夠使用的有效取值:

ide_suggests_flavours

咱們也能夠指定整型取值能夠用做標誌,也就是說這些整型值能夠使用’|’或者’&’進行與或等操做。若是咱們定義@Flavour以下:

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

那麼能夠進行以下調用:

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

@StringDef 用法與 @IntDef 基本差很少,只不過是針對String類型值而已。

更多信息能夠參考tools site

####Android分享 Q羣:315658668

相關文章
相關標籤/搜索