一、基本概念
已經知道使用 eunm 關鍵字可以定義一個枚舉,該關鍵字表示的是 java.lang.Enum
類型,即使用 enum 聲明的枚舉類型就相當於定義一個類,此類默認繼承 java.lang.Enum
類。
java.lang.Enum
的定義:
public abstract class Enum<E extends Enum<E>> extends Object
implements Comparable<E>,java.io.Serializable
從定義可看出該類實現了 Comparable 和 Serializable 接口,證明枚舉可以使用比較器和序列化操作
枚舉類的主要操作方法:
二、取得枚舉的信息
在枚舉類建立完成後,實際上都會爲其調用枚舉類中的構造方法,爲其賦值。在 Enum 類的構造方法中的第一個參數 name 就是定義的枚舉的名稱,第二個參數 ordinal 則會從 0 開始依次進行編號,之後可以使用 Enum 類總提供的 name()
和 ordinal()
方法取得名稱和編號
enum Color{
RED,GREEN,BLUE;//定義枚舉的3個類型
}
public class Test{
public static void main(String[] args) {
for (Color c:Color.values()){//枚舉.values() 表示得到全部枚舉的內容
System.out.println(c.ordinal() + "-->" + c.name());
}
}
}
三、爲每一個枚舉對象屬性賦值
1. 通過構造方法爲屬性賦值
每個枚舉類中都有其指定好的若干對象,當然每一個枚舉對象中也可以包含多個屬性,這些屬性可以通過構造方法爲其賦值
enum Color{
RED("紅色"),GREEN("綠色"),BLUE("藍色");//定義枚舉的3個類型
private Color(String name){
this.setName(name);
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test{
public static void main(String[] args) {
for (Color c:Color.values()){//枚舉.values() 表示得到全部枚舉的內容
System.out.println(c.ordinal() + "-->" + c.name() + c.getName());
}
}
}
程序中在定義的 Color 枚舉類中設置了一個 name屬性,並且通過構造方法設置 name 屬性的內容。因爲 Color 中已經明確地寫出了有一個參數的構造方法,所以在聲明枚舉內容時必須調用這個構造方法,這樣在定義枚舉內容時必須使用如下的語句形式:
RED("紅色"),GREEN("綠色"),BLUE("藍色");
2. 通過 setter方法爲屬性賦值
也可以通過調用 setter() 方式爲指定的屬性賦值,但是這樣必須明確每一個枚舉類的對象,如果操作的對象時 RED,則名字應該爲“紅色”;如果操作的對象是GREEN,則名字應該爲“綠色”等。
enum Color{
RED,GREEN,BLUE;//定義枚舉的3個類型
private String name;
public String getName(){
return name;
}
public void setName(String name) {
switch (this){
case RED:{
if ("紅色".equals(name)){
this.name = name;
}else System.out.println("設置內容錯誤。");
break;
}
case GREEN:{
if ("綠色".equals(name)){
this.name = name;
}else System.out.println("設置內容錯誤。");
break;
}
case BLUE:{
if ("藍色".equals(name)){
this.name = name;
}else System.out.println("設置內容錯誤。");
break;
}
}
}
}
public class Root{
public static void main(String[] args) {
Color c = Color.BLUE;
c.setName("蘭色");//設置一個錯誤的名字
c.setName("藍色");//設置一個正確的名字
System.out.println(c.getName());
}
}
代碼中首先通過枚舉類取得了裏面的一個對象,之後開始爲期設置內容。
四、使用比較器
在 Enum 類的定義中已經實現好了 Comparable 接口,所以枚舉類的內容本身是可以進行排序的,可以通過 TreeSet 進行枚舉的排序操作
enum Color {
RED, GREEN, BLUE;//定義枚舉的3個類型
}
public class Root{
public static void main(String[] args) {
Set<Color> t = new TreeSet<Color>();//只能加入 Color 類型
t.add(Color.GREEN);
t.add(Color.BLUE);
t.add(Color.RED);
Iterator<Color> iter = t.iterator();//使用迭代輸出
while (iter.hasNext()) {
System.out.print(iter.next() + "、");
}
}
}
這裏加入的順序和輸出的信息不一致,證明已經被排序了,是使用Enum 類中的 ordinal 屬性排序的。