1. 程式人生 > 實用技巧 >Java-列舉類與註解

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可以像修飾符一樣被使用,可用於修飾包,類,構造器,方法,成員變數,引數,區域性變數的宣告,這些資訊被儲存在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 表示該註解能寫在使用型別的任何語句中。