Java:枚舉類和注解

1. 枚舉類的使用

1.1 自定義枚舉類

枚舉類的概念與背景

當(dāng)類的對(duì)象只有有限個(gè),確定個(gè)時(shí),此類稱為枚舉類。當(dāng)需要定義一組常量時(shí),強(qiáng)烈建議使用枚舉類

  • 星期:Monday(星期一)、......、Sunday(星期天)
  • 性別:Man(男)、Woman(女)
  • 季節(jié):Spring(春節(jié))......Winter(冬天)

JDK1.5之前需要自定義枚舉類,JDK1.5新增的enum關(guān)鍵字用于定義枚舉類。

若枚舉只有一個(gè)對(duì)象, 則可以作為一種單例模式的實(shí)現(xiàn)方式。

自定義創(chuàng)建一個(gè)枚舉類


public class SeasonTest {
    public static void main(String[] args) {
        Season season = Season.SPRING;
        System.out.println(season.toString());//Season{seasonName='春天', seasonDecs='春暖花開'}
    }
}

class Season{
    //1.聲明Season對(duì)象的屬性:private final修飾
    private final String seasonName;
    private final String seasonDecs;
    //2.私有化類的構(gòu)造器
    private Season(String seasonName,String seasonDecs){
        this.seasonName = seasonName;
        this.seasonDecs = seasonDecs;
    }
    //3.提供當(dāng)前枚舉類的多個(gè)對(duì)象
    public static final Season SPRING = new Season("春天","春暖花開");
    public static final Season SUMMER = new Season("夏天","夏日炎炎");
    public static final Season AUTUMN = new Season("秋天","秋高氣爽");
    public static final Season WINTER = new Season("冬天","冰天雪地");
    //4.其它訴求
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDecs() {
        return seasonDecs;
    }

    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDecs='" + seasonDecs + '\'' +
                '}';
    }
}

1.2 關(guān)鍵字enum定義枚舉類

使用關(guān)鍵字enum創(chuàng)建一個(gè)枚舉類


public class SeasonTest {
    public static void main(String[] args) {
        Season season = Season.SPRING;
        //這是因?yàn)槊杜e類自動(dòng)繼承了java.long.Enum類,以及它的toString(),所以不會(huì)返回地址值
        System.out.println(season);//SPRING
    }
}

enum Season{
    //1.首先提供當(dāng)前枚舉類的對(duì)象,省略了多個(gè)相同的關(guān)鍵字,多個(gè)對(duì)象之間用','隔開,用';'結(jié)束
    SPRING("春天","春暖花開"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高氣爽"),
    WINTER("冬天","冰天雪地");

    //2.聲明Season對(duì)象的屬性:private final修飾
    private final String seasonName;
    private final String seasonDecs;

    //3.私有化類的構(gòu)造器
    private Season(String seasonName,String seasonDecs){
        this.seasonName = seasonName;
        this.seasonDecs = seasonDecs;
    }
    
    //4.其它訴求
    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDecs() {
        return seasonDecs;
    }

}

1.3 Enum類的主要方法

三大主要方法

  1. values():返回枚舉類型的對(duì)象數(shù)組
  2. valueOf(String objName):返回枚舉類中對(duì)象名是objName的對(duì)象
  3. toString():返回當(dāng)前枚舉類對(duì)象常量的名稱

public class SeasonTest {
    public static void main(String[] args) {
        Season season = Season.SPRING;

        //1.values():返回枚舉類型的對(duì)象數(shù)組
        Season[] values = Season.values();
        for(int i = 0;i < values.length;i++){
            System.out.println(values[i]);//SPRING、SUMMER、AUTUMN、WINTER
        }

        //2.valueOf(String objName):返回枚舉類中對(duì)象名是0bjName的對(duì)象。
        Season winter =Season.valueOf("WINTER");
        System.out.println(winter);//WINTER

        //3.toString():返回當(dāng)前枚舉類對(duì)象常量的名稱
        System.out.println(season.toString());//SPRING
    }
}
enum Season{
    //1.首先提供當(dāng)前枚舉類的對(duì)象,省略了多個(gè)相同的關(guān)鍵字,多個(gè)對(duì)象之間用','隔開,用';'結(jié)束
    SPRING("春天","春暖花開"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高氣爽"),
    WINTER("冬天","冰天雪地");
    //2.聲明Season對(duì)象的屬性:private final修飾
    private final String seasonName;
    private final String seasonDecs;
    //3.私有化類的構(gòu)造器
    private Season(String seasonName,String seasonDecs){
        this.seasonName = seasonName;
        this.seasonDecs = seasonDecs;
    }
    //4.其它訴求
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDecs() {
        return seasonDecs;
    }
}

其他方法

1.4 實(shí)現(xiàn)接口的枚舉類

  1. 實(shí)現(xiàn)接口,在enum中實(shí)現(xiàn)抽象方法,每個(gè)對(duì)象的抽象方法不同,這是一種正常情況
  2. 實(shí)現(xiàn)接口,讓枚舉類的對(duì)象分別實(shí)現(xiàn)抽象方法,每個(gè)對(duì)象的抽象方法不同
package first.knowlodge.code05;

public class SeasonTest {
    public static void main(String[] args) {
        Season[] values = Season.values();
        for(int i = 0;i < values.length;i++){
            values[i].show();
            /*
            這是一個(gè)春暖花開的春天
            這是一個(gè)夏日炎炎的夏天
            這是一個(gè)秋高氣爽的秋天
            這是一個(gè)冰天雪地的冬天
            */
        }
    }
}
interface info{
    void show();
}

enum Season implements info{
    SPRING("春天","春暖花開"){
        @Override
        public void show() {
            System.out.println("這是一個(gè)春暖花開的春天");
        }
    },
    SUMMER("夏天","夏日炎炎"){
        @Override
        public void show() {
            System.out.println("這是一個(gè)夏日炎炎的夏天");
        }
    },
    AUTUMN("秋天","秋高氣爽"){
        @Override
        public void show() {
            System.out.println("這是一個(gè)秋高氣爽的秋天");
        }
    },
    WINTER("冬天","冰天雪地"){
        @Override
        public void show() {
            System.out.println("這是一個(gè)冰天雪地的冬天");
        }
    };
    private final String seasonName;
    private final String seasonDecs;
    
    private Season(String seasonName,String seasonDecs){
        this.seasonName = seasonName;
        this.seasonDecs = seasonDecs;
    }
    
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDecs() {
        return seasonDecs;
    }
}

2. 注解的使用

2.1 注解概述

  1. 從JDK5.0開始, Java增加了對(duì)元數(shù)據(jù)的支持, 也就是Annotation(注解)。
  2. Annotation其實(shí)就是代碼里的特殊標(biāo)記,這些標(biāo)記可以在編譯, 類加載, 運(yùn)行時(shí)被讀取, 并執(zhí)行相應(yīng)的處理。
  3. Annotation可以像修飾符一樣被使用,可用于修飾包、類、構(gòu)造器、方法、成員變量、參數(shù)、局部變量的聲明。
  4. 在JavaSE中,注解的使用目的比較簡(jiǎn)單,在JavaEE/Android中注解占據(jù)了更重要的角色。

2.2 常見的Annotation示例

示例一:生成文檔相關(guān)的注解

  • @author:標(biāo)明開發(fā)該類模塊的作者,多個(gè)作者之間使用,分割
  • @version:標(biāo)明該類模塊的版本
  • @see:參考轉(zhuǎn)向,也就是相關(guān)主題
  • @since:從哪個(gè)版本開始增加的
  • @param:對(duì)方法中某參數(shù)的說明,如果沒有參數(shù)就不能寫
  • @return:對(duì)方法返回值的說明,如果方法的返回值類型是void就不能寫
  • @exception:對(duì)方法可能拋出的異常進(jìn)行說明 ,如果方法沒有用throws顯式拋出的異常就不能寫其中

示例二:在編譯時(shí)進(jìn)行格式檢查(JDK內(nèi)置的三個(gè)基本注解)

  • @Override: 限定重寫父類方法, 該注解只能用于方法
  • @Deprecated: 用于表示所修飾的元素(類, 方法等)已過時(shí)。通常是因?yàn)樗揎椀慕Y(jié)構(gòu)危險(xiǎn)或存在更好的選
  • @SuppressWarnings: 抑制編譯器警告

示例三:跟蹤代碼依賴性,實(shí)現(xiàn)替代配置文件功能

2.3 自定義Annotation

  1. 注解聲明為:@interface
  2. 內(nèi)部定義成員,通常使用用value表示
  3. 可以指定成員的默認(rèn)值,使用default定義
  4. 如果自定義注解沒有成員,表明是一個(gè)標(biāo)識(shí)作用
public @interface MyAnnotation {
    String value() default "hi"
}

@MyAnnotation("hello")
class CalssTest{
    @MyAnnotation //可以不寫值,因?yàn)橐呀?jīng)有默認(rèn)值"hi"
    void show(){
        System.out.println("這是一個(gè)注解測(cè)試");
    }
}

2.4 JDK中的元注解

什么是元注解

元注解是指用于修飾其它注解的注解

JDK中的4個(gè)元注解

  1. Retention: 用于指定該 Annotation 的生命周期:SOURCE、CLASS、RUNTIME。
  2. Target:用于指定被修飾的 Annotation 能用于修飾哪些程序元素。
  3. Documented:被該元注解修飾的Annotation 類將被javadoc工具提取成文檔。
  4. Inherited:被它修飾的Annotation將具有繼承性。如果某個(gè)類使用了被@Inherited修飾的Annotation,則其子類將自動(dòng)具有該注解。

2.5 JDK8中注解的新特性

可重復(fù)注解

使用注解修飾時(shí),可以使用該注解多次修飾,JDK8之前的方法是創(chuàng)建該注解的數(shù)組注解,進(jìn)行修飾,JDK8之后可以重復(fù)行修飾。

使用步驟:

  1. 在MyAnnotation上聲明@Repeatable,成員值為MyAnnotations.class
  2. MyAnnotation的Target和Retention注解與MyAnnotations相同

類型注解

  1. ElementType.TYPE_PARAMETER: 表示該注解能寫在類型變量的聲明語句中(如:泛型聲明)。

  2. ElementType.TYPE_USE:表示該注解能寫在使用類型的任何語句中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容