前言
在你立足處深挖下去,就會有泉水涌出!別管蒙昧者們叫嚷:“下邊永遠是地獄!”
博客主頁:KC老衲愛尼姑的博客主頁
博主的github,平常所寫代碼皆在于此
共勉:talk is cheap, show me the code
作者是爪哇島的新手,水平很有限,如果發現錯誤,一定要及時告知作者哦!感謝感謝!
文章目錄
- 枚舉
- 概述
- 基本使用
- 枚舉和switch
- 向enum類中添加方法與自定義構造函數
- 枚舉類不能進行反射的原因
- 單例模式
枚舉
概述
枚舉類型是Java5以后引用的新特性,它是一種特殊的數據類型,之所以特殊是因為它既是一種類類型但是又比類類型多了一些特殊的約束。其主要的用途是:將一組常量組織起來。在此之前表示一組常量通常是使用定義常量的方式:
public class CoolDemo {public static final int RED = 1;public static final int GREEN = 2;public static final int BLACK = 3;
}
但是常量舉例有不好的地方,比如:可能存在定義int值相同的變量,但是它有可能被誤以為是RED,編譯器也不會有任何警告,因此這種方式在枚舉出現后就不提倡了,我們利用枚舉類型來重新定義上述的常量。
public enum CoolType {RED,BLACK,GREEN
}
在定義枚舉類型的時我們使用的關鍵字是enum,enum是定義枚舉類型。枚舉類型Cool分別定義了紅色,黑色,綠色。這些值一般都是大寫字母,多個值之間用逗號隔開。那么如何使用呢?如下
public class Demo {public static void main(String[] args) {CoolType black = CoolType.BLACK;}
}
我們使用enum關鍵字定義的枚舉類,本質上是java.lang.Enum的子類。雖然自己編寫的枚舉類,沒有顯示的繼承Enum,但是它默認繼承和這個類。
基本使用
枚舉和switch
使用swtich進行條件判斷的時候,條件參數一般只能是整型,字符型。而枚舉類型也被switch所支持,字符串在java1.7后也被switch所支持。接下來,我們簡單看一下枚舉和switch的使用:
public class EnumDemo4 {public static void printName(ColorType color){switch (color){//無需使用Color進行引用case RED:System.out.println("藍色");break;case BLACK:System.out.println("紅色");break;case GREEN:System.out.println("綠色");break;}}public static void main(String[] args){printName(ColorType.RED);printName(ColorType.BLACK);printName(ColorType.GREEN);}
}
向enum類中添加方法與自定義構造函數
public enum CoolType {RED("紅色", 1),BLACK("黑色", 2),GREEN("綠色", 3);private String color;private int key;CoolType(String color, int key) {this.color = color;this.key = key;}public String getColor() {return color;}public int getKey() {return key;}public static void main(String[] args) {for (CoolType c: CoolType.values()) {System.out.println("color:"+c.color+"key:"+c.key);}}
}
運行結果 :
color:紅色key:1
color:黑色key:2
color:綠色key:3
Process finished with exit code 0
枚舉類不能進行反射的原因
我們來看看構造方法源碼
@CallerSensitivepublic T newInstance(Object ... initargs)throws InstantiationException, IllegalAccessException,IllegalArgumentException, InvocationTargetException{if (!override) {//這就是判斷如果是枚舉類型那么就只接拋出異常了, 也就不能進行構造了if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, null, modifiers);}}if ((clazz.getModifiers() & Modifier.ENUM) != 0)throw new IllegalArgumentException("Cannot reflectively create enum objects");ConstructorAccessor ca = constructorAccessor; // read volatileif (ca == null) {ca = acquireConstructorAccessor();}@SuppressWarnings("unchecked")T inst = (T) ca.newInstance(initargs);return inst;}
其中有一段代碼
if ((clazz.getModifiers() & Modifier.ENUM) != 0)
這就是判斷如果是枚舉類型那么就只接拋出異常了, 也就不能進行構造了。
單例模式
public enum Singleton {INSTANCE;public static Singleton getInstance() {return INSTANCE;}public static void main(String[] args) {Singleton singleto1 = Singleton.getInstance();Singleton singleto2 = Singleton.getInstance();System.out.println("兩個實例是否相同:"+(singleto1==singleto2));}
}
各位看官如果覺得文章寫得不錯,點贊評論關注走一波!謝謝啦!。