1. 程式人生 > 其它 >列舉類與註解

列舉類與註解

列舉類與註解


一、主要內容:

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

三、如何定義列舉類
  方式一:jdk5.0之前,自定義列舉類
  方式二:jdk5.0,可以使用enum關鍵字定義列舉類
  
四、Enum類中的常用方法:
  values()方法:返回列舉型別的物件陣列。該方法可以很方便地遍歷所有的列舉值。
  valueOf(String str):可以把一個字串轉為對應的列舉類物件。要求字串必須是列舉類物件的“名字”。如不是,會有執行時異常:IllegalArgumentException。

  toString():返回當前列舉類物件常量的名稱

五、使用enum關鍵字定義的列舉類實現介面的情況
  情況一:實現介面,在enum類中實現抽象方法
  情況二:讓列舉類的物件分別實現介面中的抽象方法
public class SeasonTest {

    public static void main(String[] args) {
        Season spring = Season.SPRING;
        System.out.println(spring);

    }

}
//自定義列舉類
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.其他訴求1:提供toString() @Override public String toString() { return "Season{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } }
自定義列舉類
/*
 * 使用enum關鍵字定義列舉類
 * 說明:定義的列舉類預設繼承於java.lang.Enum類
 
 */
public class SeasonTest1 {
    public static void main(String[] args) {
        Season1 summer = Season1.SUMMER;
        //toString():返回列舉類物件的名稱
        System.out.println(summer.toString());

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

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

interface Info{
    void show();
}

//使用enum關鍵字列舉類
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("大約在冬季");
        }
    };

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

    //2.私有化類的構造器,並給物件屬性賦值

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

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

    public String getSeasonDesc() {
        return seasonDesc;
    }
//    //4.其他訴求1:提供toString()
//
//    @Override
//    public String toString() {
//        return "Season1{" +
//                "seasonName='" + seasonName + '\'' +
//                ", seasonDesc='" + seasonDesc + '\'' +
//                '}';
//    }


//    @Override
//    public void show() {
//        System.out.println("這是一個季節");
//    }
}
使用enum關鍵字定義列舉類 註解(Annotation)
註解(Annotation)就是程式碼裡的特殊標記
註解的使用

1. 理解Annotation:
  ① jdk 5.0 新增的功能

  ② Annotation 其實就是程式碼裡的特殊標記, 這些標記可以在編譯, 類載入, 執行時被讀取, 並執行相應的處理。通過使用 Annotation,
  程式設計師可以在不改變原有邏輯的情況下, 在原始檔中嵌入一些補充資訊。

  ③在JavaSE中,註解的使用目的比較簡單,例如標記過時的功能,忽略警告等。在JavaEE/Android註解佔據了更重要的角色,例如用來配置應用程式的任何切面,代替JavaEE舊版中所遺留的繁冗
  程式碼和XML配置等。

2. Annocation的使用示例
  示例一:生成文件相關的註解
  示例二:在編譯時進行格式檢查(JDK內建的三個基本註解)
@Override: 限定重寫父類方法, 該註解只能用於方法
@Deprecated: 用於表示所修飾的元素(類, 方法等)已過時。通常是因為所修飾的結構危險或存在更好的選擇
@SuppressWarnings: 抑制編譯器警告

  示例三:跟蹤程式碼依賴性,實現替代配置檔案功能
  
3. 如何自定義註解:參照@SuppressWarnings定義
   ① 註解宣告為:@interface
   ② 內部定義成員,通常使用value表示
   ③ 可以指定成員的預設值,使用default定義
   ④ 如果自定義註解沒有成員,表明是一個標識作用。
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;



@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotations {

    MyAnnotation[] value();//value()是屬性
}
自定義註解

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

4. jdk 提供的4種元註解
元註解:對現有的註解進行解釋說明的註解
Retention:指定所修飾的 Annotation 的生命週期:SOURCE\CLASS(預設行為)\RUNTIME
只有宣告為RUNTIME生命週期的註解,才能通過反射獲取。
Target:用於指定被修飾的 Annotation 能用於修飾哪些程式元素
*******出現的頻率較低*******
Documented:表示所修飾的註解在被javadoc解析時,保留下來。
Inherited:被它修飾的 Annotation 將具有繼承性。

5.通過反射獲取註解資訊 ---到反射內容時系統講解

6. jdk 8 中註解的新特性:可重複註解、型別註解

6.1 可重複註解:① 在MyAnnotation上宣告@Repeatable,成員值為MyAnnotations.class
② MyAnnotation的Target和Retention等元註解與MyAnnotations相同。

6.2 型別註解:
ElementType.TYPE_PARAMETER 表示該註解能寫在型別變數的宣告語句中(如:泛型宣告)。
ElementType.TYPE_USE 表示該註解能寫在使用型別的任何語句中。