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 表示該注解能寫在使用類型的任何語句中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM