java 枚舉類型 Enum


  在現實社會中,有些類的實例對象是固定的。例如季節,只有春夏秋冬。如果你創建了一個season類,你當然有義務維護這個類的實例對象只能是春(SPRING)、夏(SUMMER)、秋(AUTUMN)、冬(WINTER)這四個。這個時候就體現出枚舉類的作用了,java中枚舉類型就是針對這樣的場景需求所設計的。

/**
 * 枚舉類的后綴建議為Enum,枚舉類型的實例對象建議全大寫(這樣做符合JAVA的規范)
 */
public enum SeasonEnum{  
  SPRING,SUMMER,AUTUMN,WINTER
}

 讓我們來看看怎么使用SeasonEnum這個枚舉類。

public class Test{
   public static void main(String[] args) {
    String summer = SUMMER;
    //通過valueOf,獲取SUMMER的枚舉類型
    SeasonEnum season2 = SeasonEnum.valueOf(summer); 
    //直接初始化
    SeasonEnum season1 = SeasonEnum.SPRING; 
    switch (season1) {  
            case SPRING:  
                 System.out.println(“春天”); 
                 break;  
            case SUMMER:  
                 System.out.println(“夏天”); 
                 break;  
            case AUTUMN:  
                 System.out.println(“秋天”); 
                 break; 
            case WINTER:  
                 System.out.println(“冬天”); 
                 break; 
        }  
    }  
}

  創建SeasonEnum枚舉類,在使用的時候利用switch語句進行匹配從而得到相應的輸出值,這種做法很常見。如果只需要實現這樣的功能,定義一個常量類也可以實現。那么就讓我們更進一步來看看枚舉類的作用,針對上面的例子,如果我們在很多場景下都要通過SeasonEnum的實例對象獲取相對應的中文,每次都使用switch語句就顯得代碼冗余。我們這樣設想一下,當我們創建SeasonEnum這個枚舉類時,可不可以讓SeasonEnum中的每一個實例對象都有一個getChinese()方法呢。答案是肯定的,而且這種做法在企業開發中很常見。

public enum SeasonEnum {
    //枚舉類的實例對象必須在最前面先定義,而且必須每個實例對象都必須維護上chinese成員變量
    SPRING("春天"),SUMMER("夏天"),AUMUTN("秋天"),WINTER("冬天");
 
    private String chinese;
 
    //枚舉類型的構造函數默認為private,因為枚舉類型的初始化要在當前枚舉類中完成。
    SeasonEnum (String chinese){
        this.chinese= chinese;
    }
 
    public String getChinese(){
        return chinese;
    }
}

  這樣乍一看是不是有點像我們平時創建一般實體類一樣。其實枚舉類型可以看做我們平時新建.class差不多,只是枚舉類限制了此類的實例對象。當然,枚舉類可以有自己的成員變量和方法。上面的SeasonEnum 枚舉類有了chinese這個成員變量,所以我們在定義實例對象時就要維護這個chinese成員變量。現在再來看看,我們是怎么使用這個枚舉類簡化我們的代碼。

public class Test{
    public static void main(String[] args) {
    //直接初始化
    SeasonEnum season1 = SeasonEnum.SPRING; 
    //調用SeasonEnum枚舉類的getChinese()方法獲取SPRING的中文值
    System.out.println(season1.getChinese()); 
    
   }  
}

 

-------------------------------------------------------

枚舉

注意:枚舉是單例的,單例要保證私有化構造器。

1. 如何自定義枚舉類
  1. 提供類的屬性,聲明為 private final
  2. 聲明為 final 的屬性,在構造器中初始化
  3. 通過公共方法(get)方法來調用屬性
  4. 創建枚舉類的對象:將類的對象聲明 public static final

舉例如下:

public class Season {

    //1. 提供類的屬性,聲明為 private final
    private final String seasonName;
    private final String seasonDesc;
    
    //2. 聲明為 final 的屬性,在構造器中初始化
    private Season (String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    
    //3. 通過公共的方法來調用屬性
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }
    
    //4. 創建枚舉類的對象:將類的對象聲明 public static final
    public static final Season SPRING = new Season("spring", "春暖花開");
    public static final Season SUMMER = new Season("summer", "夏日炎炎");
    public static final Season AUTUMN = new Season("autumn", "秋高氣爽");
    public static final Season WINTER = new Season("winter", "白雪皚皚");
    
    @Override
    public String toString() {
        return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }

    public void show() {
        System.out.println("這是一個季節");
    }
    
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        System.out.println(spring);
        spring.show();
        System.out.println(spring.getSeasonName());
    }
}

                    

2. 如何使用 enum 關鍵字來定義枚舉類

將對象放到最前面,並且不需要定義對象的其他屬性。
使用 enum 類來定義枚舉類,可以使用下述兩種方法來返回值。

  1. values() 方法:返回所有值
  2. valueOf() 方法:返回指定對象的值(要求傳入的形參name是枚舉類對象的名字)
    否則,報 java.lang.IllegalArgumentException 異常

改造一下上述代碼:

enum SeasonEnum {
    
    SPRING("spring", "春暖花開"),
    SUMMER("summer", "夏日炎炎"),
    AUTUMN("autumn", "秋高氣爽"),
    WINTER("winter", "白雪皚皚");
    
    private final String seasonName;
    private final String seasonDesc;

    private SeasonEnum (String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }
    
    @Override
    public String toString() {
        return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }

    public void show() {
        System.out.println("這是一個季節");
    }
    
    public static void main(String[] args) {
        SeasonEnum spring = SeasonEnum.SPRING;
        System.out.println(spring);
        spring.show();
        System.out.println(spring.getSeasonName());
        
        System.out.println("-------------------");
        
        // 1. values() 方法:返回所有值
        SeasonEnum[] seasons = SeasonEnum.values();
        for (int i = 0; i < seasons.length; i++) {
            System.out.println(seasons[i]);
        }
        
        System.out.println("-------------------");

        // 2. valueOf() 方法:返回指定對象的值(要求傳入的形參name是枚舉類對象的名字)
        // 否則,報 java.lang.IllegalArgumentException 異常
        String str = "SPRING";
        SeasonEnum sea = SeasonEnum.valueOf(str);
        System.out.println(sea);

    }
}

                 

 

3. 枚舉類實現接口

可以讓不同的枚舉類的對象調用被重寫的抽象方法,執行的效果不同。(相當於讓每個對象重寫抽象方法)

改造如下:

interface Info {
    void show();
}

 

enum SeasonEnumTest implements Info {
    SPRING("spring", "春暖花開"){
        public void show() {
            System.out.println("春天在哪里?");
        }
    },
    SUMMER("summer", "夏日炎炎"){
        public void show() {
            System.out.println("夏天在哪里?");
        }
    },
    AUTUMN("autumn", "秋高氣爽"){
        public void show() {
            System.out.println("秋天在哪里?");
        }
    },
    WINTER("winter", "白雪皚皚"){
        public void show() {
            System.out.println("冬天在哪里?");
        }
    };
    
    private final String seasonName;
    private final String seasonDesc;

    private SeasonEnumTest(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }

    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }
    
    @Override
    public String toString() {
        return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
    }

    public void show() {
        System.out.println("這是一個季節");
    }
    
    public static void main(String[] args) {
        SeasonEnumTest spring = SeasonEnumTest.SPRING;
        System.out.println(spring);
        spring.show();
        System.out.println(spring.getSeasonName());
        
        System.out.println("-------------------");
        
        // 1. values() 方法:返回所有值
        SeasonEnumTest[] seasons = SeasonEnumTest.values();
        for (int i=0; i<seasons.length;i++) {
            System.out.println(seasons[i]);
        }

        System.out.println("-------------------");
        // 2. valueOf() 方法:返回指定對象的值(要求傳入的形參name是枚舉類對象的名字)
        // 否則,報 java.lang.IllegalArgumentException 異常
        String str = "WINTER";
        SeasonEnumTest sea = SeasonEnumTest.valueOf(str);
        System.out.println(sea);
        sea.show();
    }
}

                    

 

 

出處:https://www.e-learn.cn/content/java/2584441

     https://blog.csdn.net/cauchy6317/article/details/82313088


免責聲明!

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



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