一。
jdk5 和 jdk6 中引入了enum類型,java.lang.Enum implements comparable ,Serializable 。
java.uti.concurrent.TimeUnit工具類的實現,jdk5 和 jdk6有明顯區別;
jdk6中定義七種枚舉: NANOSECONDS MICROSECONDS MILLISECONDS SECONDS MINUTES HOURS DAYS , 每一種值中重寫了9個public方法,可供對象和類靜態調用,如:
HOURS {
public long toNanos(long d) { return x(d, C5/C0, MAX/(C5/C0)); }
public long toMicros(long d) { return x(d, C5/C1, MAX/(C5/C1)); }
public long toMillis(long d) { return x(d, C5/C2, MAX/(C5/C2)); }
public long toSeconds(long d) { return x(d, C5/C3, MAX/(C5/C3)); }
public long toMinutes(long d) { return x(d, C5/C4, MAX/(C5/C4)); }
public long toHours(long d) { return d; }
public long toDays(long d) { return d/(C6/C5); }
public long convert(long d, TimeUnit u) { return u.toHours(d); }
int excessNanos(long d, long m) { return 0; }
},
TimeUnit.HOURS.toDays(30L) 返回1L ;
jdk5中定義4種枚舉: ANOSECONDS(0) MICROSECONDS(1) MILLISECONDS(2) SECONDS(3) ,通過構造TimeUnit(int index)屬性index值。包含一些靜態 和 對象方法,
jdk6 的Timeunit的使用:
TimeUnit.values();
TimeUnit.DAYS.toHours(2)
TimeUnit unit=TimeUnit.HOURS ; unit.toDay說(24); unit.convert(1, TimeUnit.DAYS)
TimeUnit.HOURS.convert(1, TimeUnit.DAYS)
引用如下:http://blog.csdn.net/abing37/archive/2009/07/29/4391222.aspx
二. 原理:
實際上 Enum 類型就是以 Java 類來實現的,沒有什麼新的特點,只不過 java 編譯器幫我們做了語法的解析和編譯。完全也可以自己實現。
對象,看個下面的例子:
1. 代碼一 WeekDay.java :
view plaincopy to clipboardprint?
/**
* @author yubing.linyb
* 2009.7.29
* 定義一個枚舉類型,代表星期一到星期日的7個縮寫常量
* 同時還定義了枚舉類型的屬性day,該屬性可以是final,也可是變量
* 同時還定義了該枚舉類型的一個方法printDay
*/
public enum WeekDay {
Mon("Monday"), Tue("Tuesday"), Wed("Wednesday"), Thu("Thursday"), Fri(
"Friday"), Sat("Saturday"), Sun("Sunday");
/**定義枚舉類型自己的屬性**/
private final String day;
private WeekDay(String day) {
this.day = day;
}
/**定義枚舉類型自己的方法**/
public static void printDay(int i){
switch(i){
case 1: System.out.println(WeekDay.Mon); break;
case 2: System.out.println(WeekDay.Tue);break;
case 3: System.out.println(WeekDay.Wed);break;
case 4: System.out.println(WeekDay.Thu);break;
case 5: System.out.println(WeekDay.Fri);break;
case 6: System.out.println(WeekDay.Sat);break;
case 7: System.out.println(WeekDay.Sun);break;
default:System.out.println("wrong number!");
}
}
public String getDay() {
return day;
}
}
Java Enum 類型的語法結構儘管和 java 類的語法不一樣,應該說差別比較大。但是經過編譯器編譯之後產生的是一個 class 文件。該 class 文件經過反編譯可以看到實際上是生成了一個類,該類繼承了 java.lang.Enum<E>.
WeekDay (javap WeekDay 命令 之後得到的內容如下 ( 去掉了彙編代碼 ) :
view plaincopy to clipboardprint?
public final class WeekDay extends java.lang.Enum{
public static final WeekDay Mon;
public static final WeekDay Tue;
public static final WeekDay Wed;
public static final WeekDay Thu;
public static final WeekDay Fri;
public static final WeekDay Sat;
public static final WeekDay Sun;
static {};
public static void printDay(int);
public java.lang.String getDay();
public static WeekDay[] values();
public static WeekDay valueOf(java.lang.String);
}
三.
java Enum標識一組相同類型的常量,既能保證單例,比較時可以直接=,不用equal比較。
四。舉例:
顏色:
public enum Color {
RED , BLUE,GREEN,BLACK ;
}
public enum EnumExample {
male(1) , female(1) ;
final int value ;
EnumExample(int value){
this.value = value ;
}
}
EnumExample a = EnumExample.male ;
System.out.println(a.name() + a.value );