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;
}