枚舉類enum、註解annotation
尚硅谷JavaSE筆記-22

枚舉類(enum)

  • 當類的物件數量是有限定的、確定的,例如:星期、性別、季節、支付方式、XX狀態
  • 需要定義一組常量時,強烈建議使用枚舉類
  • 如果類中只有一個物件,可以用單例模式
  • enum,發音"衣-囊",名詞枚舉
  • enumerate,發音"以-new-merate",動詞枚舉

自訂枚舉類

JDK 5以前

  1. 聲明物件的屬性,用private final修飾

  2. 將構造器私有化,給物件屬性賦上預想好的值

  3. 在本類中預先創立好物件,用public static final修飾

  4. 提供toSting方法

  5. 提供其他訴求,例如:get屬性等等

  6. 範例:

    class PayMethod {
        private final String name;
        private final String desc;
    
        private PayMethod(String name, String desc) {
            this.name = name;
            this.desc = desc;
        }
    
        public static final PayMethod CASH = new PayMethod("現金", "真金白銀");
        public static final PayMethod VISA = new PayMethod("VISA卡", "VISA金融卡");
        public static final PayMethod ONLINE = new PayMethod("電子支付", "街口支付");
    
        @Override
        public String toString() {
            return "PayMethod{" +
                    "name='" + name + '\'' +
                    ", desc='" + desc + '\'' +
                    '}';
        }
    }
    
    // 調用,因為是靜態,直接類名.屬性
    public class Test1 {
        public static void main(String[] args) {
            PayMethod p1 = PayMethod.CASH;
            System.out.println(p1);
        }
    }
    

關鍵字enum

JDK 5後新增的,快速有效

  • enum取代class

  • 聲明物件,用()包裹想要的屬性,彼此以",“分行,以;結尾

  • 聲明構造器,用()包裹屬性類型與屬性名,因為枚舉類new不出物件的,所以不用private

  • 範例:

    enum PayMethod {
        CASH("現金", "真金白銀"),
        VISA("VISA卡", "VISA金融卡"),
        ONLINE("電子支付", "街口支付");
        PayMethod(String name, String desc) {
        }
    }
    
  • 如果沒有要特別的屬性,只是單純做標籤使用,可以不寫構造器,留一個get方法對外就夠了,例如:

    public enum Status{
    	FREE,BUSY;
    }
    

方法

  • 不同於Obj類,enum繼承於java.lang.EnumtoString預設返回是"物件名”,也可以自己再重寫
  • 枚舉類名.values():返回枚舉類的物件數組,配合foreach可以快速得知共有哪些預設物件
    • foreach:在IDEA中,數組.for+tab,遍歷數組所有元素
  • 枚舉類名.valueOf("String"):根據物件名返回對應的枚舉類物件
    • 可以看作是一種創建枚舉類物件的方式

枚舉類實現接口

  • 聲明時加上implements

  • 重寫抽象方法實現接口

  • 也可以每一個物件分別實現,都存在時以個別物件的優先,舉例:

    interface info {
        public void show();
    }
    
    enum PayMethod implements info {
        CASH("現金", "真金白銀") {
            @Override
            public void show() {
                System.out.println("拿很多現金付錢");
            }
        },
        ONLINE("電子支付", "街口支付"),
        VISA("VISA卡", "VISA金融卡");
    
        PayMethod(String name, String desc) {
        }
    
        @Override
        public void show() {
            System.out.println("準備付錢");
        }
    }
    

註解(Annotation)

框架 = 註解 + 反射 + 設計模式

  • 就是加在聲明上面的@,不光是文字說明,甚至可以看作一種變相的形參
  • annotation,發音"A-ㄋ-tation"

JDK內建的三種註解

  • @Override:重寫的方法
  • @Deprecated:廢棄的老方法
  • @SuppressWarnings("參數"):抑制警告
    • all:全部別跳警告
    • unused:別警告未使用的
    • null
    • rawtypes
    • …很多自己查文檔

自訂註解

  • 聲明使用"@interface 註解名{}"

  • 它自動繼承了java.lang.annotataion.Annotation接口

  • 成員變量是"無參數方法"

    • 方法名稱為參數名,若只有一個預設叫value
    • 返回值是參數類型,一般都是String,也可以是其他類
  • 可以指定成員變量的初始值,用default,舉例:

    public @interface MyAnnotation {
        String value() default "hello";
        int tag() default 1;
    }
    
  • 使用註解時,若想給指定參數寫賦值,需要用"參數名= ";預設名為value的參數則可以省略,舉例:

    @MyAnnotation(tag = 4)
    @MyAnnotation(value = "something") = @MyAnnotation("something")
    
  • 沒有成員的annotation稱為標記

  • 自定義註解必須配上註解的訊息處理流程才有意義

元註解

就是註解的註解,@在一串@之上

  • @Retention(RetentionPolicy.參數):指定所修飾註解的生命週期

    • SOURCE:注解只保留在原始檔案,當Java檔編譯成class檔的時候,注解被遺棄

    • CLASS:注解被保留到class檔,但jvm載入class檔時候被遺棄,這是預設的生命週期

    • RUNTIME:注解不僅被保存到class檔中,jvm載入class檔之後,仍然存在,反射要用這個

  • @Target(ElementType.參數):指定所修飾的註解可以應用在那些結構

    • FIELD
    • PARAMETER
    • METHOD
    • CONSTRUCTOR
  • @Documented:被它修飾的註解,會在文檔中保存下來

  • @Inherited:被它修飾的註解,將具有繼承性

可重複註解

JDK 8新增的特性,先大致了解就好

  • 在想讓它能重複的註解上面聲明@Repeatable(註解名s.class)
import java.lang.annotation.Repeatable;

@Repeatable(MyAnnotations.class)
public @interface MyAnnotation {
    String[] value() default "hello";

}
  • 再造一個註解名s的新註解,返回值是原註解的數組
public @interface MyAnnotations {
    MyAnnotation[] value();

}
  • 注意他們的@Retention@Target@Inherited等等元註解屬性必須相同

類型註解

也是JDK 8新增的特性,讓註解能用在更廣的地方

  • 前面學的元註解@Target(ElementType.參數)可以決定註解能用在哪,JDK8有新參數:

    • TYPE_PARAMETER:表示該註解能寫在類型變量的聲明語句中(如泛型)
    • TYPE_USE:表示該註解能寫在使用類型的任何語句中

小結

  • 枚舉類:用於類中的物件個數確定、有限的
  • 枚舉類物件使用public static final修飾
  • 元註解=註解的註解,Retention修飾生命週期,Target修飾使用範圍

上次修改於 2021-12-07