Java-列舉類與註解
一、列舉類
1.列舉類的使用
●類的物件只有有限個,確定的。舉例如下:
➢星期: Monday(星期- )、... Sunday(星 期天)
➢性別: Man(男)、 Woman(女)
➢季節: Spring(春 7節....Winer(冬天)
➢支付方式: Cash (現金)、WeChatPay (微信)、Alipay(支付寶)、 BankCard(銀行卡) CreditCard(信用卡)
➢就職狀態: Busy、 Free、 Vocation、 Dimission
➢訂單狀態: Nonpayment (未付款)、Paid (已付款)、Fulfilled (已配貨)、Delivered (已發貨)、Return (退貨)、Checked ( 已確認)
➢執行緒狀態:建立、就緒、執行、阻塞、死亡
●當需要定義一組常量時,強烈建議使用列舉類。
●如果列舉類中只有一個物件,則可以作為單例模式的實現方式。
2.如何定義列舉類
使用enum關鍵字定義列舉類
說明定義列舉類預設繼承於java.lang.Enum類
package com.xudong.java; public class enumTest { public static void main(String[] args) { Season summer = Season.SUMMER; System.out.println(summer); } } enum Season{ //1.提供當前列舉類的物件 SUMMER("春天","春暖花開"), SPRING("夏天","夏日炎炎"), AUTUMN("秋天","秋高氣爽"), WINTER("冬天","冰天雪地"); private final String seasonName; private final String seasonDesc; //私有化類的構造器,並給物件賦值 Season(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //獲取列舉類的屬性 public String getSeasonDesc() { return seasonDesc; } public String getSeasonName() { return seasonName; } @Override public String toString() { return "Season{" + "seasonName='" + seasonName + '\'' + ", seasonDesc='" + seasonDesc + '\'' + '}'; } }
3.Enum類的主要方法:
➢values()方法:返回列舉型別的物件陣列。該方法可以很方便地遍歷所有的列舉值。
➢valueOf(String str):可以把一個字串轉為對應的列舉類物件。要求字串必須是列舉類物件的“名字”。如不是,會有執行時異常:IllegalArgumentException。
➢toString():返回當前列舉類物件常量的名稱
4.使用enum關鍵字定義的列舉類實現介面的情況
情況一:實現介面,在enum類中實現(重寫)抽象方法
情況二:讓列舉類的物件分別實現(重寫)介面中的抽象方法
二、註解
1.註解(Annotation)概述
●從JDK 5.0開始, Java增加了對元資料(MetaData)的支援,也就是Annotation(註解)
●Annotation其實就是程式碼裡的特殊標記
●Annotation可以像修飾符一樣被使用,可用於修飾包,類,構造器,方法,成員變數,引數,區域性變數的宣告,這些資訊被儲存在Annotation的"name=value”對中。
●在JavaSE中,註解的使用目的比較簡單,例如標記過時的功能,忽略警告等。在JavaEE/Android中註解佔據了更重要的角色,例如用來配置應用程式的任何切而,代替JavaEE舊版中所遺留的繁冗程式碼和XML配置等。
●未來的開發模式都是基於註解的,JPA是基於註解的,Spring2.5以.上都是基於註解的,Hibernate3.x以後也是基於註解的,現在的Struts2有一部分也是基於註解的了,註解是一種趨勢,一定程度上可以說:框架=註解+反射+設計模式。
2.常見的Annotation示例
●使用Annotation時要在其前面增加@符號,並把該Annotation當成一個修飾符使用。用於修飾它支援的程式元素
示例一:生成文件相關的註解
@author標明開發該類模組的作者,多個作者之間使用,分割
@version標明該類模組的版本
@see參考轉向,也就是相關主題
@since從哪個版本開始增加的
@param對方法中某引數的說明,如果沒有引數就不能寫
@return對方法返回值的說明,如果方法的返回值型別是void就不能寫
@exception對方法可能拋出的異常進行說明,如果方法沒有用throws顯式丟擲的異常就不能寫
其中
@param @return 和@exception這三個標記都是隻用於方法的。
@param的格式要求: @param 形參名形參型別形參說明
@return的格式要求: @return 返回值型別返回值說明
@exception的格式要求: @exception 異常型別異常說明
@param和@exception可以並列多個
示例二:在編譯時進行格式檢查(JDK內建的三個基本註解)
➢@Override:限定重寫父類方法,該註解只能用於方法
➢@Deprecated:用於表示所修飾的元素(類,方法等)已過時。通常是因為所修飾的結構危險或存在更好的選擇
➢@SuppressWarnings:抑制編譯器警告
示例三:跟蹤程式碼依賴性,實現替代配置檔案功能
➢Servlet3.0提供了註解(annotation),使得不再需要在web.xml檔案中進行Servlet的部署。
➢spring框架中關於“事務”的管理
3.自定義註解
●定義新的Annotation型別使用@interface關鍵字
●自定義註解自動繼承了java.lang.annotation.Annotation介面
●Annotation 的成員變數在 Annotation 定義中以無引數方法的形式來宣告。其方法名和返回值定義了該成員的名字和型別。我們稱為配置引數。型別只能是八種基本資料型別、String型別、 Class 型別、enum型別、Annotation 型別、以上所有型別的陣列。
●可以在定義Annotation的成員變數時為其指定初始值,指定成員變數的初始值可使用default關鍵字
●如果只有一個引數成員,建議使用引數名為value
●如果定義的註解含有配置引數,那麼使用時必須指定引數值,除非它有預設值。格式是“引數名=引數值”,如果只有一個引數成員,且名稱為value,可以省略“value= ”
●沒有成員定義的 Annotation 稱為標記;包含成員變數的 Annotation 稱為元資料 Annotation
注意:自定義註解必須配上註解的資訊處理流程(使用反射)才有意義。
4.JDK中的元註解
●JDK的元Annotation用於修飾其他的Annotation定義
●JDK5.0提供了4個標準的 meta-annotation 型別:
① @Retention:只能用於修飾一一個Annotation定義,用於指定該Annotation的生命週期,@Rentention包含一個RetentionPolicy型別的成員變數,使用@Rentention時必須為該value成員變數指定值:
➢RetentionPolicy.SOURCE:在原始檔中有效(即原始檔保留),編譯 器直接丟棄這種策略的註釋
➢RetentionPolicy.CLASS:在class檔案中有效(即class保留),當執行 Java程式時, JVM不會保留註解。這是預設值
➢RetentionPolicy.RUNTIME:在執行時有效(即執行時保留),當執行 Java程式時,JVM會保留註釋。程式可以通過反射獲取該註釋。
② @Target:用於修飾Annotation定義,用於指定被修飾的Annotation能用於修飾哪些程式元素。@Target 也包含一個名為value的成員變數。
③ @Documented:用於指定被該元Annotation修飾的Annotation類將被javadoc工具提取成文件。預設情況下,javadoc是不包括註解的
➢定義為Documented的註解必須設定Retention值為RUNTIME。
④ @Inherited:被它修飾的Annotation將具有繼承性。如果某個類使用了被@Inherited修飾的Annotation,則其子類將自動具有該註解。
➢比如:如果把標有@Inherited註解的自定義的註解標註在類級別上,子類則可以繼承父類類級別的註解
➢實際應用中,使用較少
5.通過反射獲取註解資訊
待補充......
6.型別註解
ELementType.TYPE_PARAMETER 表示該註解能寫在型別變數的宣告語句中(如:泛型宣告)。
ELementType.TYPE_USE 表示該註解能寫在使用型別的任何語句中。