枚舉類(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
:別警告未使用的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