Day69.註解&列舉類的複習 -Java註解&列舉類

轉行一點成功發表於2020-10-12

列舉類和註解

.

列舉類的使用

1. 列舉類的說明:

*  1. 列舉類的理解: 類的物件只有有限個、確定的。我們稱此類為列舉類
*  2. 當需要定義一組常量時,強烈建議使用列舉類
*  3. 如果列舉類中只有一個物件,則可以作為單例模式的實現方式。

2. 如何自定義列舉類?步驟:

*  方式一: jdk5.0之前,自定義列舉類
*  方式二: jdk5.0時,可以使用enum關鍵詞定義列舉類
自定義列舉類

//自定義列舉類
class Season{
    //1. 宣告Season物件的屬性: private final修飾
    private final String seasonName;
    private final String seasonDesc;

    //2. 私有化類的構造器,並給物件屬性賦值
    private Season(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //3. 提供當前列舉類的多個物件:  public static final
    public static final Season SPRING = new Season("春天","春暖花開");
    public static final Season SUMMER = new Season("夏天","夏日炎炎");
    public static final Season AUTUMN = new Season("秋天","秋高氣爽");
    public static final Season WINTER = new Season("冬天","凌冽寒風");

    //4. 其他訴求1: 獲取列舉類物件的屬性
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }

    //4. 其他訴求2: 提供toString()

    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }

}

3. jdk5.0 新增使用enum定義列舉類。步驟:

使用enum關鍵字定義列舉類

//方式二:使用enum關鍵字定義列舉類
enum Season1{
    //1. 提供當前列舉類的物件,多個物件之間用 "," 隔開,末尾的物件用 ";" 結束
    SPRING("春天","春暖花開"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高氣爽"),
    WINTER("冬天","凌冽寒風");

    //2. 宣告Season物件的屬性: private final修飾
    private final String seasonName;
    private final String seasonDesc;


    Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    //4. 其他訴求1: 獲取列舉類物件的屬性
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }

}

4. 使用enum定義列舉類之後,列舉類常用方法:(繼承於java.lang.Enum類)

Enum類中的常用方法:
*    values(): 返回列舉型別的物件陣列。該方法可以很方便地遍歷所有的列舉值。
*    valueOf(String str): 可以把一個字串轉換為對應的列舉類物件。要求字串必須是列舉類物件的“名字”。如果不是,會執行時異常;
*    toString(): 返回當前列舉類物件常量的名稱
    public static void main(String[] args) {
        Season1 autumn = Season1.AUTUMN;
//      System.out.println(Season1.class.getSuperclass());

        //toString(): 返回列舉類物件的名稱
        System.out.println(autumn.toString());

        System.out.println("======================================");

        //values(): 返回所有列舉類物件構成的陣列
        Season1[] values = Season1.values();
        for (int i = 0; i < values.length; i++) {
            System.out.println(values[i]);
        }
        Thread.State[] values1 = Thread.State.values();
        for (int i = 0; i < values1.length; i++) {
            System.out.println(values1[i]);
        }

        //valueOf(String Object): 返回列舉類中物件名是objName的物件。
        //如果沒有objName的列舉類物件,則拋異常: IllegalArgumentException
        Season1 spring = Season1.valueOf("SPRING");
        System.out.println(spring);

        System.out.println("====================");

    }

5. 使用enum定義列舉類之後,如何讓列舉類物件分別實現介面:

*  情況1: 實現介面,在enum類中實現抽象方法
*  情況2: 讓列舉類的物件分別去實現介面中的抽象方法,每個物件的方法體都可以不一樣
enum Season1 implements Info{
    //1. 提供當前列舉類的物件,多個物件之間用 "," 隔開,末尾的物件用 ";" 結束
    SPRING("春天","春暖花開"){
        @Override
        public void show() {
            System.out.println("這是一個春天");
        }
    },
    SUMMER("夏天","夏日炎炎"){
        @Override
        public void show() {
            System.out.println("這是一個夏天");
        }
    },
    AUTUMN("秋天","秋高氣爽"){
        @Override
        public void show() {
            System.out.println("這是一個秋天");
        }
    },
    WINTER("冬天","凌冽寒風"){
        @Override
        public void show() {
            System.out.println("這是一個冬天");
        }
    };
}

.

註解的使用

1. 註解的理解

*    ① jdk5.0 新增功能
*    ② Annotation其實就是程式碼的特殊標記,這些標記可以在編譯,類載入,執行時被讀取,並執行相應的處理。
*      通過使用Annotation,程式設計師可以在不改變原有邏輯的情況下,在原始檔中嵌入一些補充資訊。
*    ③ 在JavaSE中,註解的使用目的比較簡單,例如標記過時的功能,忽略警告等。在JavaEE/Android中註解佔據了更重要的角色,
*      例如用來配置應用程式的任何切面,代替JavaEE舊版中所遺留的繁冗程式碼和XML配置等。
框架 = 註解 + 反射 + 設計模式

2. 註解的使用示例

*    示例一: 生成文件相關的註解
*    示例二: 在編譯時進行格式檢查(JDK內建的三個基本註解)
*          @Override: 限定重寫父類方法,該註解只能用於方法
*          @Deprecated: 用於表示所修飾的元素(類,方法等)已過時。通常是因為所修飾的結構危險或存在更好的選擇
*          @SuppressWarnings: 抑制編譯器報錯
*    例項三: 跟蹤程式碼依賴性,實習替代配置檔案功能

3. 如何自定義註解

如何自定義註解: 參照@SuppressWarnings定義
*      ① 註解宣告為: @interface
*      ② 內部定義成員,通常使用value表示
*      ③ 可以指定成員的預設值,使用default定義
*      ④ 如果自定義註解沒有成員,表明是一個標識作用

說明:

*    如果註解有成員,在使用註解時,需要指明成員的值。
*    自定義註解必須配上註解的資訊處理流程(使用反射)才有意義
*    自定義註解通常都會指明兩個元註解: Retention、Target

程式碼舉例:

@Repeatable(MyAnnotations.class)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.
        FIELD,ElementType.
        METHOD,ElementType.
        PARAMETER,ElementType.
        CONSTRUCTOR, ElementType.
        TYPE_PARAMETER,ElementType.TYPE_USE})
public @interface MyAnnotation {
    String value()default "hello";//default 預設值:

}

4. 元註解:

*    元註解: 對現有的註解進行解釋說明的註解
*   Retention: 指定所修飾的 Annotation 的生命週期: SOURCE/CLASS(預設行為)/RUNTIME
*          只有宣告為RUNTIME宣告週期的註解,才能通過反射獲取。
*   Target: 用於指定被修飾的 Annotation 能用於修飾哪些程式元素

*   ----↓出現的頻率較低------
*   Documented: 表示所修飾的註解在被javadoc解析式,儲存下來。 (預設情況下:javadoc解析不保留註解)
*   Inherited: 被修飾的 Annotation 將具有繼承性。

後設資料的概念:
	String name = "Tom"; //String 和 name 都是解釋說明"Tom";String和name都是"Tom"的後設資料

5. 如何獲取註解資訊: 通過反射來獲取、呼叫。

前提:

要求此註解的元註解Retention中宣告的生命週期狀態為: RUNTIME

6. JDK8中註解的新特性:

*      ① 可重複註解
*          1) 在MyAnnotation上宣告@Repeatable,成員值為MyAnnotations.class
*          2) MyAnnotation的@Target,@Retention等元註解與MyAnnotations相同
*      ② 型別註解
*          1) ElementType.TYPE_PARAMETER 表示該註解能寫在型別變數的宣告語 句中(如:泛型宣告)。
*          2) ElementType.TYPE_USE 表示該註解能寫在使用型別的任何語句中

相關文章