一。
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 );