java中的列舉型別

My_name_is_ZwZ發表於2018-10-26

目錄

什麼是列舉?

多例模式的類:

列舉類的使用:

關於列舉型別的幾點總結:


什麼是列舉?

列舉型別是Java 5中新增特性的一部分,它是一種特殊的資料型別,之所以特殊是因為它既是一種類(class)型別卻又比類型別多了些特殊的約束,但是這些約束的存在也造就了列舉型別的簡潔性、安全性以及便捷性。

多例模式的類:

首先我們寫一個多例模式的類:

/**
 * Create by ZwZ
 * DateTime:2018/10/25 16:50
 * Description :多例模式中的多例類可以有多個例項,而且多例類必須自己建立、管理自己的例項,並向外界提供自己的例項。
 */
//列舉類
public class Season {
    private final String name;//季節名字
    private final String desc;//季節描述
    //私有化構造方法
    private Season(String name,String desc){
         this.name = name;
         this.desc = desc;
    }
    //向外界提供得到屬性的方法
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
    //建立列舉類的物件(用全大寫表示常量)
    public static Season SPRING = new Season("spring","春暖花開");
    public static Season SUMMER = new Season("summer","夏日炎炎");
    public static Season AUTUMN = new Season("autumn","秋高氣爽");
    public static Season WINTER = new Season("winter","白雪茫茫");
}

其中需要說明的就是:

以上這個類其實就可以看成一個列舉類,它用來給外界提供有限的物件;

其屬性進行私有化就是一個封裝的思想,使得其他類只能通過set方法對屬性進行修改,而不是直接就可以進行更改。而這裡沒有set方法,因為我們這裡寫的是列舉類,是不希望其他類使用Season物件的時候對這些物件的屬性進行修改的,所以使用final進行修飾;

其構造方法必須進行私有化,否則的話在其他類中可以new出來Season物件,所以這個多例模式就沒有什麼存在的意義了;

在此類中建立物件,用於其他類通過這個類拿到其特定的(列舉出來的)物件。所以要使用static修飾,而因為此物件的屬性都是不可以修改的,可以理解成常量,所以取名字的時候使用全部大寫的形式(完全可以不使用,但是這是一個程式碼規範問題)。

以上就寫成了一個列舉類,使用者只能通過這個類來得到特定的,有限的,物件。下面我們寫一個測試類對其進行使用:

public class Test1 {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        String name = spring.getName();
        String desc = spring.getDesc();
        System.out.println(name + "" + desc);
    }
}

控制檯列印輸出的資訊如下:

這便是列舉類的用法。如果我們在Test1的main方法中加上下面的程式碼:

Season season = new Season("四季如春","這是一個好的季節");

 就會報錯:

'Season(java.lang.String, java.lang.String)' has private access in 'enumDemo.Season'

 也就是說,,構造方法被私有化了。在Test1這個類中是不能對其進行new的。

列舉類的使用:

上邊我們已經看到了一個多例模式下的列舉類的書寫方法。但是是比較麻煩的,在JDK5之後就提出了一個新的關鍵字:enum,專門來進行列舉類的構建。下面我們使用enum寫一個和上邊那個Season類有一模一樣功能的類:

/**
 * Create by ZwZ
 * DateTime:2018/10/25 16:46
 * Description : how to use enum?
 */
public enum SeasonEnum {
    //在列舉類中規定,必須放在類的最前面  預設被public static修飾
    SPRING("spring","春暖花開"),
    SUMMER("summer","夏日炎炎"),
    AUTUMN("autumn","秋高氣爽"),
    WINTER("winter","白雪茫茫");

    private final String name;//季節名字
    private final String desc;//季節描述
    private SeasonEnum(String name,String desc){
        this.name = name;
        this.desc = desc;
    }
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
}

 以上這個類,在功能上是和Season一樣的。以上類中的SPRING,SUMMER,AUTUMN,WINTER都是SeasonEnum類的物件,並且由public static進行修飾。其實使用enum修飾的SeasonEnum,在編譯後也是會成為類似Season形式的類。但是這個是程式設計師不用操心的,你只管去使用就好。

關於列舉型別的幾點總結:

1.列舉像一個類,又像一個陣列

2.它不能有public的建構函式,這樣做可以保證客戶程式碼沒有辦法新建一個enum的例項

3.所有列舉值都是public , static , final的。注意這一點只是針對於列舉值,我們可以和在普通類裡面定義 變數一樣定義其它任何型別的非列舉變數,這些變數可以用任何你想用的修飾符。

相關文章