1、在某些情况下,一个类的实例对象的数量是有限且固定的,如季节类,它的实例对象只有春、夏、秋、冬。在Java中像这种对象实例有限且固定的类被称为枚举类;
2、在Java中使用enum关键字来定义枚举类,其地位与class、interface相同;
3、枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器(只能使用 private访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举值时被调用)
创建步骤
将构造器私有化,不让用户随意调用
去掉 set 方法,不让用户随意修改,保留 get 方法
在类的内部,直接创建具体固定的对象(用 static 去修饰)
利用 final 去进一步修饰,再次防止用户修改
- //演示自定义类枚举
- class Season02{
- private String name;
- private String desc;
-
- //自定义类实现枚举
- public final static Season02 SPRING = new Season02("春天", "万物复苏");
- public final static Season02 SUMMER = new Season02("夏天", "是真的热");
- public final static Season02 AUTUMN = new Season02("秋天", "飒爽又悲凉");
- public final static Season02 WINTER = new Season02("冬天", "这里的冬天没有雪");
-
- private Season02(String name, String desc) {
- this.name = name;
- this.desc = desc;
- }
-
- public String getName() {
- return name;
- }
-
- public String getDesc() {
- return desc;
- }
-
- @Override
- public String toString() {
- return "Season02{" +
- "name='" + name + '\'' +
- ", desc='" + desc + '\'' +
- '}';
- }
- }
所有的枚举值都是public static final的,且非抽象的枚举类不能再派生子类;
如果有多个常量,就用逗号进行间隔,在最后一个常量写完后用分号表示语句结束即可;
使用 enum 定义枚举时,需要将定义的常量对象写在最前面;
- public class WareConstant {
- public enum PurchaseStatusEnum{
- CREATED(0,"新建"),ASSIGNED(1,"已分配"),
- RECEIVE(2,"已领取"),FINISH(3,"已完成"),
- HASERROR(4,"有异常");
- private int code;
- private String msg;
- private PurchaseStatusEnum(int code,String msg){
- this.code = code;
- this.msg = msg;
- }
-
- public int getCode() {
- return code;
- }
-
- public String getMsg() {
- return msg;
- }
-
- }
-
- public enum PurchaseDetailStatusEnum{
- CREATED(0,"新建"),ASSIGNED(1,"已分配"),
- BUYING(2,"正在采购"),FINISH(3,"已完成"),
- HASERROR(4,"采购失败");
- private int code;
- private String msg;
- private PurchaseDetailStatusEnum(int code,String msg){
- this.code = code;
- this.msg = msg;
- }
-
- public int getCode() {
- return code;
- }
-
- public String getMsg() {
- return msg;
- }
-
- }
- }
Enum 使用细节
使用 enum 关键字后,就不能在继承其它类了,因为 enum 会隐式继承 Enum,但是 Java 是单继承机制的。
枚举类可以去实现接口,且实现形式和其它普通类一样。
如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略
当有多个枚举对象时,使用,间隔,最后有一个分号结尾
枚举对象必须放在枚举类的行首