枚舉類(enum)
- 當類的物件數量是有限定的、確定的,例如:星期、性別、季節、支付方式、XX狀態
- 需要定義一組常量時,強烈建議使用枚舉類
- 如果類中只有一個物件,可以用單例模式
enum,發音"衣-囊",名詞枚舉enumerate,發音"以-new-merate",動詞枚舉
自訂枚舉類
JDK 5以前
-
聲明物件的屬性,用
private final修飾 -
將構造器私有化,給物件屬性賦上預想好的值
-
在本類中預先創立好物件,用
public static final修飾 -
提供
toSting方法 -
提供其他訴求,例如:
get屬性等等 -
範例:
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.Enum,toString預設返回是"物件名”,也可以自己再重寫 枚舉類名.values():返回枚舉類的物件數組,配合foreach可以快速得知共有哪些預設物件- foreach:在IDEA中,
數組.for+tab,遍歷數組所有元素
- foreach:在IDEA中,
枚舉類名.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:別警告未使用的nullrawtypes- …很多自己查文檔
自訂註解
-
聲明使用"
@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.參數):指定所修飾的註解可以應用在那些結構FIELDPARAMETERMETHODCONSTRUCTOR- …
-
@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