enum也是关键字。所以enum的级别与class是一致的。

一. 什么是枚举?

枚举也是一种特殊的数据类型。
枚举也是一种特殊的类。
枚举就是一个有固定实例数量的类。
例如:计算机三原色RGB。交通信号灯颜色。季节。月份。

二. 枚举的定义格式:

public enum RGB {
    RED,GREEN,BLUE;
}
我们定义了一个枚举类型:RGB。
在这个类型中,有三个实例。分别是RED,GREEN,BLUE;

三. 枚举使用的格式:

枚举中的每一个值,都是枚举的一个实例。
public class Test {
    public static void main(String[] args) {
        RGB rgb1 = RGB.RED;
        RGB rgb2 = RGB.BLUE;
        RGB rgb3 = RGB.GREEN;
    }
}

四. 枚举本质上就是一个Java类

枚举是在JDK5才加入的新特性。
在JDK5之前。我们都是使用Java类的方式实现枚举的要求。
这是在JDK5之前,一个类只有三个实例的标准写法。
public class RGBClass {
    public final static RGBClass R = new RGBClass();
    public final static RGBClass G = new RGBClass();
    public final static RGBClass B = new RGBClass();
    private RGBClass() {
    }
}
在这个代码的基础上。我们把固定的代码删掉,会得到什么?
public class RGBClass {
    R;
    G;
    B;
}
进而得到枚举类型(enum)标准写法:
public enum RGB {
    RED,GREEN,BLUE;
}

五. 如何使用枚举类型?

1. 枚举一般配合switch一起使用:
RGB rgb ;
switch (rgb1){
    case RED:
        System.out.println("red");
        break;
    case BLUE:
        System.out.println("blue");
        break;
    case GREEN:
        System.out.println("green");
        break;
}
2. 当一个方法的参数是一个枚举类型时:
问:一个公司只有7个部门。用什么类型来表示这7个部门。
(1)使用编号,int,分别1-7。
编写方法时。参数就是int。 public void print(int i){}
int数据类型合法的取值范围要比1-7大。
业务规范要求1-7的取值。但是语法要求合法的int类型太多了。
(2)使用枚举。使用一个有7个实例的枚举。
编写方法时,参数是枚举类型。 public void print(RGB rgb){}
当RGB做为参数时,合法的取值有3个。RGB.RED , RGB.GREEN , RGB.BLUE;
3. 编写披萨的枚举:
public enum PizzaEnum {
    SEAFOOD_SUPREME_PIZZA,SUPER_SUPREME_PIZZA;
}
/**
 * 工厂方法
 * @param pizzaEnum 披萨的枚举
 * @return 披萨对象
 */
public static Pizza create(PizzaEnum pizzaEnum){
    switch (pizzaEnum){
        case SUPER_SUPREME_PIZZA:
            return new SuperSupremePizza();
        case SEAFOOD_SUPREME_PIZZA:
            return new SeafoodSupremePizza();
        default:
            return null;
    }
}

六. 枚举可以有属性和方法

枚举就是一个Java类。
public enum RGB {
    RED,GREEN,BLUE;
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
RGB.RED.setName(“红色”);

七. 枚举中可以有构造方法

在JDK5之前的方式如下:
public class RGBClass {
    private String name;
    public final static RGBClass R = new RGBClass("红");
    public final static RGBClass G = new RGBClass("绿");
    public final static RGBClass B = new RGBClass("蓝");
    public RGBClass(String name) {
        this.name = name;
    }
删除掉统一可以不用写的内容之后:
public class RGBClass {
    private String name;
    R ("红");
    G ("绿");
    B ("蓝");
    public RGBClass(String name) {
        this.name = name;
    }
按格式转换:枚举应该如下:
public enum RGB {
    RED("红"),
    GREEN("绿"),
    BLUE("蓝");
    private String name;
    RGB(String name) {
        this.name = name;
    }

八. 披萨进行优化

在披萨的枚举中加入了一个字符串类型的属性。利用构造方法为这个属性赋值。
public enum PizzaEnum {

    SEAFOOD_SUPREME_PIZZA("com.xja.domain.SeafoodSupremePizza"),
    SUPER_SUPREME_PIZZA("com.xja.domain.SuperSupremePizza");

    private String className;

    PizzaEnum(String className) {
        this.className = className;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }
}
优化工厂类:利用反射。枚举每一个实例。都绑定自己对应类的权限命名
public class PizzaFactory {

    public static Pizza creat(PizzaEnum pizzaEnum) throws Exception {

        String className = pizzaEnum.getClassName();

        return (Pizza) Class.forName(className).newInstance();
    }
public static Pizza getPizza(PizzaEnum pizzaEnum) throws Exception {

    Pizza pizza = creat(pizzaEnum);

    pizza.prepare();
    pizza.make();
    pizza.bake();
    pizza.cut();
    pizza.box();

    return pizza;
}