021android初级篇之android的Context

021android初级篇之Android注解支持(Support Annotations)

定义:注解(Annotation),也叫元数据。

一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

作用分类:

  1. 编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
  2. 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
  3. 编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】

常见的注解

@IntDef/StringDef: 类型定义注解

整型除了可以作为资源的引用之外,也可以用作“枚举”类型使用。

@IntDef和”typedef”作用非常类似,你可以创建另外一个注解,然后用@IntDef指定一个你期望的整型常量值列表,最后你就可以用这个定义好的注解修饰你的API了。

appcompat库里的一个例子:

import android.support.annotation.IntDef;
...
public abstract class ActionBar {
...
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
@Retention(RetentionPolicy.SOURCE)
public @interface NavigationMode {}

public static final int NAVIGATION_MODE_STANDARD = 0;
public static final int NAVIGATION_MODE_LIST = 1;
public static final int NAVIGATION_MODE_TABS = 2;

@NavigationMode
public abstract int getNavigationMode();

public abstract void setNavigationMode(@NavigationMode int mode);

上面非注解的部分是现有的API。我们创建了一个新的注解(NavigationMode)并且用@IntDef标注它,通过@IntDef我们为返回值或者参数指定了可用的常量值。我们还添加了@Retention(RetentionPolicy.SOURCE)告诉编译器这个新定义的注解不需要被记录在生成的.class文件中(译者注:源代码级别的,生成class文件的时候这个注解就被编译器自动去掉了)。

使用这个注解后,如果你传递的参数或者返回值不在指定的常量值中的话,IDE将会标记出这种情况。
button.setLayoutDirection(View.Text_ALIGNMENT_TEXT_START);
Must be one of View.LAYOUT_DIRECTION_RTL,VI...

你也可以指定一个整型是一个标记性质的类型;这样客户端代码就通过|,&等操作符同时传递多个常量了:

@IntDef(flag=true, value={
        DISPLAY_USE_LOGO,
        DISPLAY_SHOW_HOME,
        DISPLAY_HOME_AS_UP,
        DISPLAY_SHOW_TITLE,
        DISPLAY_SHOW_CUSTOM
})
@Retention(RetentionPolicy.SOURCE)
public @interface DisplayOptions {}

最后,还有一个字符串版本的注解,就是@StringDef,它和@IntDef的作用基本上是一样,所不同的是它是针对字符串的。该注解一般不常用,但是有的时候非常有用,比如在限定向Activity#getSystemService方法传递的参数范围的时候。

要了解关于类型注解的更多详细信息,请参考

Nullness Annotations

@Nullable注解能被用来标注给定的参数或者返回值可以为null。
类似的,@NonNull注解能被用来标注给定的参数或者返回值不能为null。

如果一个本地变量的值为null(比如因为过早的代码检查它是否为null),而你又把它作为参数传递给了一个方法,并且该方法的参数又被@NonNull标注,那么IDE会提醒你,你有一个潜在的崩溃问题。

v4 support library中的FragmentActivity的示例代码:

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
...

/**
 * Add support for inflating the <fragment> tag.
 */
@Nullable
@Override
public View onCreateView(String name, @NonNull Context context, @NonNull AttributeSet attrs) {
...

(如果你执行Analyze > Infer Nullity,或者你在键入时把@NonNull替换成了@NotNull,那么IDE可能会提供附加的IntelliJ注解。参考底部的“IntelliJ Annotations”段落了解更多)

注意@NonNull和@Nullable并不是对立的:还有第三种可能:未指定。当你没有指定@NonNull或者@Nullable的时候,工具就不能确定,所以这个API也就不起作用。

最初,我们在findViewById方法上标注@Nullable,从技术上说,这是正确的:findViewById可以返回null。但是如果你知道你在做什么的时候(如果你传递给他一个存在的id)他是不会返回null的。当我们使用@Nullable注解它的时候,就意味着源代码编辑器中会有大量的代码出现高亮警告。如果你已经意识到每次使用该方法都应该明确的进行null检查,那么就只能用@Nullable标注返回值。有个经验规则:看现有的“好的代码”(比如审查产品代码),看看这些API是怎么被使用的。如果该代码为null检查结果,你应该为方法注解@Nullable。

参考链接

  1. Android注解支持(Support Annotations)

你可能感兴趣的:(021android初级篇之android的Context)