枚舉類型的使用介紹和靜態導入

1、枚舉(Enum):

JDK5.0中加入了枚舉類型,使用enum關鍵字定義,可以按照如下定義:

public enum Weather{
    Sunny,
    Rainy,
    Cloudy,
}
1.1、枚舉類型中的兩個靜態方法:
values()
        獲取枚舉類型的所有枚舉常量
valueOf(Class<T> enumType, String name)
返回帶指定名稱的指定枚舉類型的枚舉常量。
1.2、values方法的使用:
for(Weather weather : Weather.values()){
    System.out.println(weather);
}
System.out.println(Weather.valueOf(Weather.class, "Sunny"));
1.2、values方法的使用:
for(Weather weather : Weather.values()){
    System.out.println(weather);
}
//以下輸出爲Sunny
System.out.println(Weather.valueOf(Weather.class, "Sunny"));
1.3、創建包含私有成員變量的枚舉常量:
public enum Weather{
    Sunny("晴天"),
    Rainy("雨天"),
    Cloudy("多雲");//私有成員變量,保存名稱private String value;public String getValue() {return value;
    }//帶參構造函數Weather(String value){this.value = value;
    }
}
publicstaticvoid main(String[] args) {
    Weather weather1 = Weather.Sunny;//以下輸出爲"晴天"System.out.println(weather1.getValue());
}
1.4、枚舉類型詳細說明:

enum關鍵字的作用類似於class或interface,本質上是在定義一個類別,細節的實現由編譯器完成。

自定義的枚舉類型實質上繼承自java.lang.Enum抽象類。而每一個成員常量其實就是自己定義的枚舉類型的一個實例,都被定義爲final,所有無法改變他們,另外他們是static,pulibc的,即:

publicstaticfinal 枚舉常量;

在運行期間我們無法再使用該枚舉類型創建新的實例,這些實例是在編譯期間就完全確定下來了的。

1.5、枚舉的比較:
compareTo
public final int compareTo(E o)
比較此枚舉與指定對象的順序。在該對象小於、等於或大於指定對象時,分別返回負整數、零或正整數。 枚舉常量只能與相同枚舉類型的其他枚舉常量進行比較。該方法實現的自然順序就是聲明常量的順序。
指定者:
接口 Comparable<E extends Enum<E>> 中的 compareTo
參數:
o - 要比較的對象。
返回:
負整數、零或正整數,根據此對象是小於、等於還是大於指定對象。
Weather[] arrays = Weather.values();
for(Weather weather2 : arrays){
    System.out.println((Weather.Sunny).compareTo(weather2));
}
1.6、枚舉的相關方法:
ordinal
publicfinalintordinal()
返回枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量序數爲零)。 大多數程序員不會使用此方法。它被設計用於複雜的基於枚舉的數據結構,比如 EnumSet 和 EnumMap。
返回:
枚舉常量的序數
for(Weather weather2 : arrays){
    System.out.println(weather2.ordinal() + ":" + weather2);
}
2、EnumSet:
public abstract class EnumSet<E extends Enum<E>>
extends AbstractSet<E>
implements Cloneable, Serializable

與枚舉類型一起使用的專用 Set 實現。枚舉 set  中所有鍵都必須來自單個枚舉類型,該枚舉類型在創建 set 時顯式或隱式地指定。枚舉 set  在內部表示爲位向量。此表示形式非常緊湊且高效。此類的空間和時間性能應該很好,足以用作傳統上基於 int  的“位標誌”的替換形式,具有高品質、類型安全的優勢。如果其參數也是一個枚舉 set,則批量操作(如 containsAll 和  retainAll)也應運行得非常快。

此類可以幫助我們建立枚舉值的集合,裏面提供了一系列的靜態方法,可以指定不同的集合建立方式。

2.1、of方法
public static <E extends Enum<E>> EnumSet<E> of(E first,
                                                E... rest)
創建一個最初包含指定元素的枚舉 set。此工廠方法的參數列表使用變量參數功能,該方法可以創建一個最初包含任意個元素的枚舉 set,但是這樣很可能比不使用變量參數的重載運行得慢。
參數:
first - 此 set 最初要包含的元素
rest - 此 set 最初要包含的其餘元素
返回:
最初包含指定元素的枚舉 set
拋出:
NullPointerException - 如果任意參數爲 null,或 rest 爲 null
EnumSet<Weather> enumSet = EnumSet.of(Weather.Sunny, Weather.Rainy);

for(Iterator<Weather> iter = enumSet.iterator(); iter.hasNext();){
    System.out.println(iter.next());
}
2.2、noneOf方法
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType)
創建一個具有指定元素類型的空枚舉 set。
參數:
elementType - 此枚舉 set 的元素類型的 class 對象
拋出:
NullPointerException - 如果 elementType 爲 null
EnumSet<Weather> enumSet2 = EnumSet.noneOf(Weather.class);
enumSet2.add(Weather.Sunny);
enumSet2.add(Weather.Rainy);

for(Iterator<Weather> iter = enumSet2.iterator(); iter.hasNext();){
    System.out.println(iter.next());
}
3、List保存枚舉類型:
List<Weather> list = new ArrayList<Weather>();
list.add(Weather.Sunny);
list.add(Weather.Cloudy);

for(Iterator<Weather> iter = list.iterator(); iter.hasNext();){
    System.out.println(iter.next());
}
4、EnumMap類:
public class EnumMap<K extends Enum<K>,V>
        extends AbstractMap<K,V>
        implements Serializable, Cloneable

與枚舉類型鍵一起使用的專用 Map 實現。枚舉映射中所有鍵都必須來自單個枚舉類型,該枚舉類型在創建映射時顯式或隱式地指定。枚舉映射在內部表示爲數組。此表示形式非常緊湊且高效。

枚舉映射根據其鍵的自然順序 來維護(該順序是聲明枚舉常量的順序)。在 collection 視圖(keySet()、entrySet() 和 values())所返回的迭代器中反映了這一點。

EnumMap
public EnumMap(Class<K> keyType)
創建一個具有指定鍵類型的空枚舉映射。
參數:
keyType - 此枚舉映射的鍵類型的 class 對象
拋出:
NullPointerException - 如果 keyType 爲空
Map<Weather, String> enumMap = new EnumMap<Weather, String>(Weather.class);
enumMap.put(Weather.Sunny, "晴天");
enumMap.put(Weather.Rainy, "雨天");
5、枚舉在實際開發中的使用:
publicstatic String getString(Weather weather){if(weather == Weather.Sunny){return Weather.Sunny.getValue();
    } elseif(weather == Weather.Rainy){return Weather.Rainy.getValue();
    } elseif(weather == Weather.Cloudy){return Weather.Cloudy.getValue();
    }return"不符合的天氣情況";
}

調用上面的方法:

Weather weather3 = Weather.Sunny;
System.out.println(getString(weather3));
6、靜態導入:

如果要使用靜態變量或者方法,必須給出該方法所在的類。而使用靜態導入可以使被導入類的所有靜態變量和靜態方法在當前類直接可見,這樣就無需給出他們的類名了:

如加入以下導入語句:

importstatic java.util.EnumSet.noneOf;

就可以直接使用這個靜態方法了:

EnumSet<Weather> enumSet2 = noneOf(Weather.class);
enumSet2.add(Weather.Sunny);
enumSet2.add(Weather.Rainy);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章