列舉的幾種使用案例(簡單,進階,switch,單例)
首先,應該注意:
1>.列舉型別都隱式繼承了java.lang.Enum類,因此不能繼承其他類,但可以實現介面;
2>.列舉型別只能有私有的構造方法(java執行時建立,外部不能進行例項化);
3>不能泛型化;
4>當有欄位和方法時,列舉常量的列表必須以分號結尾;
5>編譯器在建立列舉時會自動新增一些特殊方法。例如,它們具有一個靜態values方法和valueOf(String)方法
例子一(反編譯(反彙編).class檔案判斷):
寫一個java類名為:enumTest.java
enum Day{
DAY,MOUTH,YEAR
}
public class enumTest {
public static void main(String[] args) {
Day day = Day.DAY;
}
}
1.javac編譯:javac enumTest.java
產生兩個.class 檔案:Day.class enumTest.class
2.反編譯Day.class ,發現原本寫在enumTest.java檔案中的enum型別的Day,被編譯為了一個繼承了Enum類的final類,裡面的關鍵字也被編譯為了static final型別的變數。還包含values()與valueOf(String)方法。
反彙編Day.class為位元組碼
3.反編譯enumTest.class 在該類中enum Day已經不再該類中,被單獨編譯一個類
反彙編enumTest.class 為位元組碼
例子二(實際使用):
package cn.yoylee.test;
import java.util.Arrays;
/*簡單使用*/
//public enum Day{
// DAY,MOUTH,YEAR;
//}
/*進階使用1*/
//enum Day{
// DAY("天"),MOUTH("月"),YEAR("年"); //以分號結束(因為後面跟有方法)
//
// private String value;
//
// Day(String str){
// this.value = str;
// }
//
// public String getValue(){
// return value;
// }
//}
/*進階使用2*/
enum Day{
DAY{
public String getInfo(){
return "天";
}
};
/**
* 定義抽象方法
* @return
*/
public abstract String getInfo();
}
public class enumTest {
public static void main(String[] args) {
/*簡單使用測試 */
// Day day = Day.DAY;
// //測試Enum的values()方法
// System.out.println(Arrays.toString(Day.values()));
/*進階使用測試1*/
// for (Day day : Day.values()){
// System.out.println("引數名稱:"+day.name()+" 引數值:"+day.getValue());
// }
/*進階使用2*/
System.out.println(Day.DAY.getInfo());
}
}
package cn.yoylee.test;
public enum EnumTest3 {
SYSTEM_NORMAL(200, "系統正常"),
//異常 返回碼範圍 400 -419 業務無關異常
INVALID_PARAM(401,"無效引數"),
//服務端異常
SERVICE_ERROR(500, "服務異常");
private int code;
private String desc;
EnumTest3(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public static void main(String[] args) {
for (EnumTest3 para : EnumTest3.values()){
System.out.println("錯誤程式碼為:"+para.getCode()+" 錯誤資訊:"+para.getDesc());
}
}
/**
* 輸出:
* 錯誤程式碼為:200 錯誤資訊:系統正常
錯誤程式碼為:401 錯誤資訊:無效引數
錯誤程式碼為:500 錯誤資訊:服務異常
*/
}
例子三(enum與switch):
enum Color {GREEN,RED,BLUE}
public class EnumTest2 {
public static void printName(Color color){
switch (color){
case BLUE: //無需使用Color進行引用
System.out.println("藍色");
break;
case RED:
System.out.println("紅色");
break;
case GREEN:
System.out.println("綠色");
break;
}
}
public static void main(String[] args){
printName(Color.BLUE);
printName(Color.RED);
printName(Color.GREEN);
/*輸出*/
//藍色
//紅色
//綠色
}
}
例子四(enum與單例模式):
1.利用enum實現的單例模式類:EnumTest4_Signal
package cn.yoylee.test;
public enum EnumTest4_Signal {
//自定義一個列舉的元素,代表EnumTest4_Signal類的例項
INSTANCE;
//單例可以有自己的操作
public void otherMethods(){
//功能處理
}
}
2.測試enum實現的單例模式的類:EnumTest4_use
package cn.yoylee.test;
/**
* 測試enum實現的單例模式
*/
public class EnumTest4_use {
public static void main(String[] args) {
//用enum實現的單利模式類:EnumTest4_Signal
EnumTest4_Signal instance = EnumTest4_Signal.INSTANCE;
EnumTest4_Signal instance1 = EnumTest4_Signal.INSTANCE;
System.out.println("instance物件的hash值為:"+instance.hashCode());
System.out.println("instance1物件的hash值為:"+instance1.hashCode());
System.out.println("是否為同一個物件:"+(instance.hashCode()==instance1.hashCode()));
//非單例模式的類:EnumTest2
EnumTest2 enumTest = new EnumTest2();
EnumTest2 enumTest1 = new EnumTest2();
System.out.println("enumTest物件的hash值為:"+enumTest.hashCode());
System.out.println("enumTest1物件的hash值為:"+enumTest1.hashCode());
System.out.println("是否為同一個物件:"+(enumTest.hashCode()==enumTest1.hashCode()));
/**
* 輸出:
* instance物件的hash值為:1163157884
instance1物件的hash值為:1163157884
是否為同一個物件:true
enumTest物件的hash值為:1956725890
enumTest1物件的hash值為:356573597
是否為同一個物件:false
*/
}
}
相關文章
- 單例的幾種寫法單例
- 列舉簡單總結
- Python單例的一種簡單寫法Python單例
- NSOperation的進階使用和簡單探討
- NSThead的進階使用和簡單探討
- 單例模式(下)---聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) - 聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) – 聊一聊單例模式的幾種寫法單例模式
- Java 利用列舉實現單例模式Java單例模式
- 單例模式有幾種寫法?單例模式
- 使用列舉來寫出更優雅的單例設計模式單例設計模式
- 簡單探討TypeScript 列舉型別TypeScript型別
- 單例模式你會幾種寫法?單例模式
- 實現單例模式的 9 種方法,你知道幾種?單例模式
- Effective Java - 構造器私有、列舉和單例Java單例
- Java 列舉 switch的用法Java
- laravel 佇列的簡單使用Laravel佇列
- 幾種常用設計模式的簡單示例設計模式
- 關於python單例的常用幾種實現方法Python單例
- 孔乙己的疑問:單例模式有幾種寫法單例模式
- 簡單的單例模式其實也不簡單單例模式
- Java列舉:為什麼它是單例模式的最佳選擇?Java單例模式
- 簡單瞭解JS中的幾種遍歷JS
- 10.6——單例模式案例單例模式
- 單例模式,真不簡單單例模式
- 正規表示式理解及簡單應用舉例
- 面試中單例模式有幾種寫法?面試單例模式
- 為什麼我牆裂建議大家使用列舉來實現單例。單例
- 使用列舉ENUM替換Switch或If-Else
- python中佇列簡單使用Python佇列
- 單例模式的幾種實現And反射對其的破壞單例模式反射
- storm簡單案例ORM
- Android初步進階之Design Support Library庫簡單使用(一)Android
- 使用Java實現簡單的鬥地主案例Java
- 高階單例模式單例模式
- 簡單介紹MySQL索引失效的幾種情況MySql索引
- 單例模式就是如此簡單單例模式
- 1284 海港 普及組 NOIP2016 佇列基礎 簡單列舉 簡單模擬 優先佇列(priority_queue)佇列