進擊的Android工程師之Java基礎: 註解

在Android開發中咱們常常會用到註解,例如@Override Butterknife中的BindView等。這裏主要記錄下註解怎麼寫和簡單的使用。html

基本語法

咱們經過Override註解的定義來切入註解的語法。java

@Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }

在java源碼中,經過上面的幾行代碼就定義了一個Override的註解,定義註解的時候用到了兩個元註解Target,Retention。什麼是元註解?註解註解的註解就是元註解。跟定義接口差很少,就是用到的是@interface,而後加上了元註解。那麼元註解的做用是什麼呢?android

元註解

元註解:@Target,@Retention,@Documented,@Inherited數組

@Target

@Target說明了註解所修飾對象的類型。由EelmentType所描述編輯器

public enum ElementType {
    TYPE, //class interface enum
    FIELD, //域
    METHOD, //方法
    PARAMETER, //參數
    CONSTRUCTOR, //構造
    LOCAL_VARIABLE, //局部變量
    ANNOTATION_TYPE, //註解
    PACKAGE, //包
}

實例:ide

/**
 * 這樣咱們就定義了一個做用在類型和域上面的註解
 */
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface Entity {
}

@Retention

@Retention 代表註解做用的時間。由RetentionPolicy所描述工具

public enum RetentionPolicy {
    /**
     * 只在源碼顯示,編譯時丟棄;
     */
    SOURCE,

    /**
     * 編譯時記錄到.class中,運行時忽略;默認值
     */
    CLASS,

    /**
     * 運行時保留,運行中能夠處理。(咱們用的較多的就是這個)
     */
    RUNTIME
}

@Documented

含有該註解類型的元素(帶有註釋的)會經過javadoc或相似工具進行文檔化。
咱們來對比一下:性能

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoDocumented {
}

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestDocumented {
}
    
    @TestDocumented
    public void funTestDocumented(){
        System.out.println("有@Documented");
    }

    @NoDocumented
    public void funNoDocucmented(){
        System.out.println("無@Documented");
    }

定義以上兩個註解並測試,利用javadoc生成文檔後顯示以下:
Documented測試

@Inherited

根據字面意思是繼承。也就是標識該註解能夠被繼承。只做用在類上面。spa

註解參數

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
    String value() default "";
    int name() default 0;
}

咱們在定義註解的時候,能夠添加相關的參數。定義了參數以後咱們就能夠經過反射的方式獲取到註解,而後獲取該參數了。以下所示:

Class<TestInheritedC> cClass = TestInheritedC.class;
        Entity annotation = cClass.getAnnotation(Entity.class);
        if (annotation != null) {
            String value = annotation.value();
            int name = annotation.name();
            System.out.println("value = " + value + "  name = " + name);
        }

註解參數的類型包括:基本數據類型String,Class,Enum,Annotation,及前邊這些類型的數組類型

Java的內置註解

@Override 重寫了父類的方法
@Deprecated 表示已過期,不推薦使用。通常在使用被標註的方法、類等時編輯器會出現刪除線。
@@SuppressWarnnings 用於通知Java編譯器關閉對特定類、方法、成員變量、變量初始化的警告

Android的相關注解

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

support-annotations包爲咱們提供了不少實用的註解,來方便代碼的檢查,例如 @Nullable ,@NonNull等,具體的使用參考Android官方文檔

這裏說一下類型的定義IntDefStringDef,在開發中常常要使用Enum類型。不過Enum在開發中性能不如常量。咱們能夠使用註解的方式進行替換。例以下面是View源碼中的一個栗子

@IntDef({VISIBLE, INVISIBLE, GONE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Visibility {}

借用官方文檔上的栗子,是這麼使用的:

// Define the list of accepted constants and declare the NavigationMode annotation
    @Retention(RetentionPolicy.SOURCE)
    @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
    public @interface NavigationMode {}

    // Declare the constants
    public static final int NAVIGATION_MODE_STANDARD = 0;
    public static final int NAVIGATION_MODE_LIST = 1;
    public static final int NAVIGATION_MODE_TABS = 2;

    // Decorate the target methods with the annotation
    @NavigationMode
    public abstract int getNavigationMode();
相關文章
相關標籤/搜索