天天看點

新星計劃Day2【JavaSE】 枚舉類與注解

新星計劃Day2【JavaSE】 枚舉類與注解

💕前面的話💞

本篇文章将介紹枚舉類與注解,枚舉類即為類的對象隻有有限個,确定的。注解其實就是代碼裡的特殊标記,下面我們具體來看看它們裡面的内容吧,這個章節内容不多,一天就可以學完啦( ̄︶ ̄)↗

👩‍💻部落格首頁:京與舊鋪的部落格首頁

✨歡迎關注🖱點贊🎀收藏⭐留言✒

🔮本文由京與舊鋪原創

😘系列專欄:java學習

💻首發時間:🎞2022年4月26日🎠

🎨你做三四月的事,八九月就會有答案,一起加油吧

🀄如果覺得部落客的文章還不錯的話,請三連支援一下部落客哦

🎧最後的話,作者是一個新人,在很多方面還做的不好,歡迎大佬指正,一起學習哦,沖沖沖

💬推薦一款模拟面試、刷題神器👉​​​點選進入網站​​

文章目錄

  • ​​新星計劃Day2【JavaSE】 枚舉類與注解​​
  • ​​@[toc]​​
  • ​​🧨496p 枚舉類的了解​​
  • ​​🚀497p 自定義枚舉類​​
  • ​​🎐498 使用enum關鍵字定義枚舉類​​
  • ​​🍗499 enum類中的常用方法​​
  • ​​🧁500 使用enum關鍵字定義的枚舉類實作接口​​
  • ​​🛸502 注解(Annotation)的了解​​
  • ​​🥐503 Annotation的使用示例​​
  • ​​🧆504 jdk内置的三個基本注解​​
  • ​​🧦505 如何自定義注解​​
  • ​​👟506 jdk中4個基本的元注解的使用1​​
  • ​​🎭507 jdk中4個基本的元注解的使用2​​
  • ​​🧵508 jdk8新特性:可重複注解​​
  • ​​🥪509 jdk8新特性:類型注解​​
新星計劃Day2【JavaSE】 枚舉類與注解

🧨496p 枚舉類的了解

==類的對象隻有有限個,确定的。==舉例如下:

星期:Monday(星期一)、…、Sunday(星期天)

性别:Man(男)、Woman(女)

季節:Spring(春節)…Winter(冬天)

支付方式:Cash(現金)、WeChatPay(微信)、Alipay(支付寶)、BankCard(銀行卡)、CreditCard(信用卡)

就職狀态:Busy、Free、Vocation、Dimission

訂單狀态:Nonpayment(未付款)、Paid(已付款)、Delivered(已發貨)、Return(退貨)、Checked(已确認)Fulfilled(已配貨)、

線程狀态:建立、就緒、運作、阻塞、死亡

當需要定義一組常量時,強烈建議使用枚舉類

枚舉類的實作

JDK1.5之前需要自定義枚舉類

JDK 1.5 新增的enum 關鍵字用于定義枚舉類

若枚舉隻有一個對象, 則可以作為一種單例模式的實作方式。

🚀497p 自定義枚舉類

方式一:jdk5.0之前,自定義枚舉類

方式二:jdk5.0時,可以使用enum關鍵字定義枚舉類

public class SeasonTest{
    public static void main(String[] args){
        Season spring=Season.SPRING;
        System.out.println(spring);
    }
}
//自定義枚舉類
class Season{
    //1.聲明Season對象的屬性
    private final String seasonName;
    private final String seasonDesc;
    //2.私有化類的構造器
    private Season(String seasonName,String seasonDesc){
        this.seasonName=seasonName;
        this.seasonDesc=seasonDesc;
    }
    //3.提供目前枚舉類的多個對象:public static final的
     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.其他訴求1:擷取枚舉類對象的屬性
    public String getSeasonName(){
        return seasonName;
    }
    public String getSeasonDesc(){
        return seasonDesc;
    }
    //4.其他訴求1:提供toString()
    public String toString(){
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}      

🎐498 使用enum關鍵字定義枚舉類

說明:定義的枚舉類預設繼承于java.lang.Enum類

public class SeasonTest{
    public static void main(String[] args){
        Season spring=Season1.SPRING;
        System.out.println(spring);
    }
}
//使用enum關鍵字枚舉類
enum Season1{
     //1.提供目前枚舉類的對象,多個對象之間用,隔開,末尾對象;結束
     SPRING("春天","萬物複蘇"),
     SUMMER("春天","萬物複蘇"),
     AUTUMN("春天","萬物複蘇"),
     WINTER("春天","萬物複蘇");
    //1.聲明Season對象的屬性
    private final String seasonName;
    private final String seasonDesc;
    //2.私有化類的構造器
    private Season(String seasonName,String seasonDesc){
        this.seasonName=seasonName;
        this.seasonDesc=seasonDesc;
    }
     //4.其他訴求1:擷取枚舉類對象的屬性
    public String getSeasonName(){
        return seasonName;
    }
    public String getSeasonDesc(){
        return seasonDesc;
    }
    //4.其他訴求1:提供toString()
    public String toString(){
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}      

🍗499 enum類中的常用方法

values()方法:傳回枚舉類型的對象數組。該方法可以很友善地周遊所有的枚舉值。

valueOf(String str):可以把一個字元串轉為對應的枚舉類對象。要求字元串必須是枚舉類對象的“名字”。如不是,會有運作時異常:IllegalArgumentException。

toString():傳回目前枚舉類對象常量的名稱

public class SeasonTest{
    public static void main(String[] args){
        Season spring=Season1.SPRING;
        System.out.println(spring.toString());
        //values():
        Season1[] values=Season1.values();
        for(int i=0;i<values.length;i++){
            System.out.println(values[i]);
        }
        Thread.State[] values1=Thread.State.values();
        for(int i=0;i<values1.length;i++){
            System.out.println(values1[i]);
        }
        // valueOf(String objName):傳回枚舉類中對象名是objName的對象
        Season1 winter=Season1.valueOf("WINTER");\
        //如果沒有objName的枚舉類對象,則抛異常:IllegalArgumentException
        //Season1 winter=Season1.valueOf("WINTER1");
        System.out.println(winter);
        
    }
}
//使用enum關鍵字枚舉類
enum Season1{
     //1.提供目前枚舉類的對象,多個對象之間用,隔開,末尾對象;結束
     SPRING("春天","萬物複蘇"),
     SUMMER("春天","萬物複蘇"),
     AUTUMN("春天","萬物複蘇"),
     WINTER("春天","萬物複蘇");
    //1.聲明Season對象的屬性
    private final String seasonName;
    private final String seasonDesc;
    //2.私有化類的構造器
    private Season(String seasonName,String seasonDesc){
        this.seasonName=seasonName;
        this.seasonDesc=seasonDesc;
    }
     //4.其他訴求1:擷取枚舉類對象的屬性
    public String getSeasonName(){
        return seasonName;
    }
    public String getSeasonDesc(){
        return seasonDesc;
    }
    //4.其他訴求1:提供toString()
    public String toString(){
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}      

🧁500 使用enum關鍵字定義的枚舉類實作接口

情況一:實作接口,在enum類中實作抽象方法

情況二:讓枚舉類的對象分别實作接口中的抽象方法

public class SeasonTest{
    public static void main(String[] args){
        Season spring=Season1.SPRING;
        System.out.println(spring.toString());
        //values():
        Season1[] values=Season1.values();
        for(int i=0;i<values.length;i++){
            System.out.println(values[i]);
        }
        Thread.State[] values1=Thread.State.values();
        for(int i=0;i<values1.length;i++){
            System.out.println(values1[i]);
        }
        // valueOf(String objName):傳回枚舉類中對象名是objName的對象
        Season1 winter=Season1.valueOf("WINTER");\
        //如果沒有objName的枚舉類對象,則抛異常:IllegalArgumentException
        //Season1 winter=Season1.valueOf("WINTER1");
        System.out.println(winter);
        winter.show();
    }
}
interface Info{
    void show();
}
//使用enum關鍵字枚舉類
enum Season1 implements Info{
     //1.提供目前枚舉類的對象,多個對象之間用,隔開,末尾對象;結束
     SPRING("春天","萬物複蘇"){
         public void show(){
             System.out.println("春天在哪裡?");
         }
     },
     SUMMER("夏天","萬物複蘇"){
         public void show(){
             System.out.println("夏天在哪裡?");
         }
     },
     AUTUMN("秋天","萬物複蘇"){
         public void show(){
             System.out.println("秋天在哪裡?");
         }
     },
     WINTER("冬天","萬物複蘇"){
         public void show(){
             System.out.println("冬天在哪裡?");
         }
     };
    //1.聲明Season對象的屬性
    private final String seasonName;
    private final String seasonDesc;
    //2.私有化類的構造器
    private Season(String seasonName,String seasonDesc){
        this.seasonName=seasonName;
        this.seasonDesc=seasonDesc;
    }
     //4.其他訴求1:擷取枚舉類對象的屬性
    public String getSeasonName(){
        return seasonName;
    }
    public String getSeasonDesc(){
        return seasonDesc;
    }
    //4.其他訴求1:提供toString()
    public String toString(){
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
    public void show(){
        System.out.println("這是一個季節");
    }
}      

🛸502 注解(Annotation)的了解

從JDK 5.0 開始, Java 增加了對中繼資料(MetaData) 的支援, 也就是Annotation(注解)

Annotation 其實就是代碼裡的特殊标記, 這些标記可以在編譯, 類加載, 運作時被讀取, 并執行相應的處理。通過使用Annotation, 程式員可以在不改變原有邏輯的情況下, 在源檔案中嵌入一些補充資訊。代碼分析工具、開發工具和部署工具可以通過這些補充資訊進行驗證或者進行部署。

Annotation 可以像修飾符一樣被使用, 可用于修飾包,類, 構造器, 方法, 成員變量, 參數, 局部變量的聲明, 這些資訊被儲存在Annotation 的“name=value” 對中。

在JavaSE中,注解的使用目的比較簡單,例如标記過時的功能,忽略警告等。在JavaEE/Android中注解占據了更重要的角色,例如用來配置應用程式的任何切面,代替JavaEE舊版中所遺留的繁冗代碼和XML配置等。

未來的開發模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以後也是基于注解的,現在的Struts2有一部分也是基于注解的了,注解是一種趨勢,一定程度上可以說:架構= 注解+ 反射+ 設計模式。

🥐503 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架構中關于“事務”的管理

🧆504 jdk内置的三個基本注解

注解的使用

1.了解annotation:

1.1 jdk5.0新增的功能

1.2 Annotation 其實就是代碼裡的特殊标記, 這些标記可以在編譯, 類加載, 運作時被讀取, 并執行相應的處理。通過使用Annotation, 程式員可以在不改變原有邏輯的情況下, 在源檔案中嵌入一些補充資訊。

1.3 在JavaSE中,注解的使用目的比較簡單,例如标記過時的功能,忽略警告等。在JavaEE/Android中注解占據了更重要的角色,例如用來配置應用程式的任何切面,代替JavaEE舊版中所遺留的繁冗代碼和XML配置等。

2.使用示例

示例一:生成文檔相關的注解

示例二:在編譯時進行格式檢查(JDK内置的三個基本注解)

@Override: 限定重寫父類方法, 該注解隻能用于方法

@Deprecated: 用于表示所修飾的元素(類, 方法等)已過時。通常是因為所修飾的結構危險或存在更好的選擇

@SuppressWarnings: 抑制編譯器警告

示例三:跟蹤代碼依賴性,實作替代配置檔案功能

public class AnnotationTest{
    public static void main(String[] args){
        person p=new Student();
        p.walk();
        @SuppressWarnings("unused")
        int num=10;
        @SuppressWarnings({"unused","rawtypes"})
        ArrayList list=new ArrayList();    }
}
class Person{
    private String name;
    private int age;
    public Person(){
        
    }
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void walk(){
        System.out.println("人走路");
    }
    public void eat(){
        System.out.println("人吃飯");
    }
}
interface Info{
    void show();
}
class Student extends Person implements Info{
    @Override
    public void walk(){
        System.out.println("學生走路");
    }
    @Override
    public void show(){
        
    }
}      

🧦505 如何自定義注解

參照 @SuppressWarnings定義

1.注解聲明為:@interface

2.内部定義成員,通常使用value表示

3.可以指定成員的預設值,使用default定義

4.如果自定義的注解沒有成員,表明是一個辨別作用

5.如果注解有成員,在使用注解時,需要指明成員的值

👟506 jdk中4個基本的元注解的使用1

自定義注解必須配上注解的資訊處理流程(使用反射)才有意義

中繼資料:對現有資料進行修飾

String name=“atguigu”;

元注解:對現有的注解進行解釋說明的注解

Retention: 隻能用于修飾一個Annotation定義, 用于指定該Annotation 的生命周期, @Rentention包含一個RetentionPolicy類型的成員變量, 使用@Rentention時必須為該value 成員變量指定值:

RetentionPolicy.SOURCE:在源檔案中有效(即源檔案保留),編譯器直接丢棄這種政策的注釋

RetentionPolicy.CLASS:在class檔案中有效(即class保留),當運作Java 程式時, JVM 不會保留注解。這是預設值

RetentionPolicy.RUNTIME:在運作時有效(即運作時保留),當運作Java 程式時, JVM 會保留注釋。程式可以通過反射擷取該注釋。

Target

Documented

Inheirted

🎭507 jdk中4個基本的元注解的使用2

@Target`: 用于修飾Annotation 定義, 用于指定被修飾的Annotation 能用于修飾哪些程式元素。@Target 也包含一個名為value 的成員變量。

@Documented: 用于指定被該元Annotation 修飾的Annotation 類将被javadoc工具提取成文檔。預設情況下,javadoc是不包括注解的。

定義為Documented的注解必須設定Retention值為RUNTIME。

@Inherited: 被它修飾的Annotation 将具有繼承性。如果某個類使用了被@Inherited 修飾的Annotation, 則其子類将自動具有該注解。

比如:如果把标有@Inherited注解的自定義的注解标注在類級别上,子類則可以繼承父類類級别的注解

實際應用中,使用較少

🧵508 jdk8新特性:可重複注解

可重複注解:1.在MyAnnotation上聲明@Repeatable,成員值為MyAnnotation.class

2. MyAnnotation的Target和Retention等元注解與MyAnnotations相同      

🥪509 jdk8新特性:類型注解

import java.util.ArrayList;

/**
 * 注解的使用
 *
 * 6.jdk 8 中注解的新特性:可重複注解、類型注解
 *
 *   6.1可重複注解:① 在MyAnnotation上聲明@Repeatable,成員值為MyAnnotations.class
 *                ② MyAnnotation的Target和Retention等元注解與MyAnnotations相同。
 *
 *   6.2類型注解:
 *      ElementType.TYPE_PARAMETER 表示該注解能寫在類型變量的聲明語句中(如:泛型聲明)。
 *      ElementType.TYPE_USE 表示該注解能寫在使用類型的任何語句中。
 *
 */
public class AnnotationTest {
 
}


class Generic<@MyAnnotation T>{

    public void show() throws @MyAnnotation RuntimeException{

        ArrayList<@MyAnnotation String> list = new ArrayList<>();

        int num = (@MyAnnotation int) 10L;
    }

}      

好的,枚舉類和注解的内容我們就進行到這裡,在後面的内容中呢我們也會應用到它,現在先對它有一個基礎的了解

下期預告:新星計劃Day3 【JavaSE】集合🍩