java中的列舉型別
目錄
什麼是列舉?
列舉型別是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的。注意這一點只是針對於列舉值,我們可以和在普通類裡面定義 變數一樣定義其它任何型別的非列舉變數,這些變數可以用任何你想用的修飾符。
相關文章
- java中的列舉型別學習Java型別
- Java - Enum 列舉型別Java型別
- java基礎(十一) 列舉型別Java型別
- 列舉型別在JPA中的使用型別
- 列舉型別型別
- Java基礎教程(15)–列舉型別Java型別
- Java列舉型別enum的詳解及使用Java型別
- ENUM列舉型別型別
- Rust的列舉型別EnumRust型別
- OC中列舉寫法 以及 字串型別列舉實現探索字串型別
- java中的列舉Java
- TypeScript 中列舉型別的理解?應用場景?TypeScript型別
- JPA不識別MySQL的列舉型別MySql型別
- JavaSE基礎:列舉型別Java型別
- 【C++】資料型別-列舉型C++資料型別
- @RequestBody中列舉型別值不匹配報錯型別
- Java 集合列舉泛型(一)Java泛型
- C++ 列舉型別介紹C++型別
- 列舉型別分享 第五節型別
- PHP 列舉型別的管理與設計PHP型別
- 類中的結構體或列舉等型別的前置宣告結構體型別
- 補充:C語言列舉型別C語言型別
- C語言 列舉資料型別C語言資料型別
- 簡單探討TypeScript 列舉型別TypeScript型別
- 物聯網學習教程—列舉型別型別
- Java列舉Java
- Java 列舉、JPA 和 PostgreSQL 列舉JavaSQL
- 介面和列舉在方法中的區別
- Java中的型別提升Java型別
- Java 列舉 switch的用法Java
- Java 列舉(enum)Java
- java列舉類Java
- Java列舉-通過值查詢對應的列舉Java
- Java enum列舉類詳解 列舉的常見用法Java
- 【四】使用列舉和結構來建立值型別型別
- Enum列舉型別實戰總結,保證有用!型別
- 深入淺出 Java 中列舉的實現原理Java
- 別再說Python沒有列舉型別了,好好看看Python型別