文章目錄
Enumerations 枚舉
Enums很像public static final int聲明,它原來常被用於enum values。它比ints最大的優點在於它是型別安全的,你不能錯誤的用一種類型代替另一種類型的枚舉(Enums),不同於ints,他們對編譯器來說都是一樣的。
Enums只提供了一點點新增的功能。EnumMap 和 EnumSet這兩個工具類,是對Enums進行了特殊最佳化的標準集合(collection )類。如果你確定你的集合(collection )裡只包含(Enums),你就可以使用這兩個經過最佳化的標準工具集合類來代替HashMap 或 HashSet
。
在很多情況下,你的程式裡可以用Enums代替public static final int。他們的功能是相當的,你也可以靜態引入Enums(那樣它的調用和對public static final int的調用是一致的)即使是在內建類或內建enum中。注意:在比較Enums時,他們的排列順序將代表他們的索引。
隱含的靜態方法
兩個靜態方法將會隱含在你寫的Enums聲明中。他們不會實現在java.lang.Enum中,因為他們在java.lang.Enum的子類中,而不是聲明在java.lang.Enum本身。
第一個方法values()返回Enums的所有制的一個值數組。
第二個方法valueOf()返回特定String對應的值,特定String必須精確的吻合。
方法
最令人興奮的就是每一個enums都可以有自己的方法。過去你可能書寫很多代碼對public static final int(代表特定的資料庫)執行switch 操作將其轉換為JDBC連接字串。現在你可以直接使用enums的方法達到你的目的。
下面的例子DatabaseType enum有一個抽象方法,每個enum執行個體將會提供這個方法的實現。
public enum DatabaseType { ORACLE { public String getJdbcUrl() {...} }, MYSQL { public String getJdbcUrl() {...} }; public abstract String getJdbcUrl();}
現在你可以直接使用這個enum 提供的有效方法:DatabaseType dbType = ...;String jdbcURL = dbType.getJdbcUrl();
一些完整的程式碼片段:
EnumExample1.java
enum OperatingSystems {
windows, unix, linux, macintosh
}
public class EnumExample1 {
public static void main(String args[])
{
OperatingSystems os;
os = OperatingSystems.windows;
switch(os) {
case windows:
System.out.println("You chose Windows!");
break;
case unix:
System.out.println("You chose Unix!");
break;
case linux:
System.out.println("You chose Linux!");
break;
case macintosh:
System.out.println("You chose Macintosh!");
break;
default:
System.out.println("I don't know your OS.");
break;
}
}
}
EnumBitmapExample.java
enum ProgramFlags {
showErrors(0x01),
includeFileOutput(0x02),
useAlternateProcessor(0x04);
private int bit;
ProgramFlags(int bitNumber)
{
bit = bitNumber;
}
public int getBitNumber()
{
return(bit);
}
}
public class EnumBitmapExample {
public static void main(String args[])
{
ProgramFlags flag = ProgramFlags.showErrors;
System.out.println("Flag selected is: " +
flag.ordinal() +
" which is " +
flag.name());
}
}