一、概述
enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式Class Enum<E extends Enum<E>>
,而 E
表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal)
构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
public enum EnumTest { MON, TUE, WED, THU, FRI, SAT, SUN; }
这段代码实际上调用了7次 Enum(String name, int ordinal):
new Enum<EnumTest>("MON",0); new Enum<EnumTest>("TUE",1); new Enum<EnumTest>("WED",2); ... ...
二、自定义枚举属性方法
给 enum 对象加一下 value 的属性和 getValue() 的方法,构造方法覆盖默认isRest方法:
public enum EnumTest { MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) { @Override public boolean isRest() { return true; } }, SUN(0) { @Override public boolean isRest() { return true; } }; private int value; private EnumTest(int value) { //MON(1) value=1 this.value = value; } public int getValue() { return value; } public boolean isRest() { return false; } }
这里的value值标示的是枚举值定义时括号里的值,这个值不同与枚举ordinal()方法返回值,ordinal获取的是值的下标序号
枚举需要注意(详细看java.lang.Enum源码):
- 枚举可以使用switch分支语法
- 枚举类可以覆盖默认toString方法,默认toString返回name(MON)
- 枚举常量是单例的,所以直接调用==操作符 子类不可以重写该方法
- 因为枚举常量是单例的,所以不允许克隆
三、枚举和常量区别
枚举和常量都是用来标示一些常量,但是他们之间存在一定的区别:
1.枚举是一种数据类型而常量不是,也就是在实体中定义属性变量时可以是枚举变量但是无法将引用变量定义为常量(类似枚举值是类,而常量是无法改变值)
2.在动态反射生成对象时,类对象包含,枚举可以像正常变量使用而常量无法满足,同样在数据存储(hibernate)
3.常量无类型约束
四、总结
枚举有其特有的性质,它可以理解是特殊类的集合又在展现上拥有常量的方便性,补充了常量在作为实体对象属性上的缺点。
时间: 2024-10-06 03:58:32