枚举(enum
)是JDK1.5提出的一个新特性。
Java中的枚举被定义为了一个类,将枚举引入类以后,枚举的功能被大大扩展,里面可以有构造函数、方法和实例变量,甚至可以实现接口,每一个枚举常量都是它的枚举类型的一个对象。
1. 引出问题
我们先来回顾一下多例设计模式:
package www.testdemo;
class Color {
private String title;
private static final Color RED = new Color("RED");
private static final Color GREEN = new Color("GREEN");
private static final Color BLUE = new Color("BLUE");
private Color(String title) {
this.title = title;
}
public static Color getInstance(int ch) {
switch (ch) {
case 1:
return RED;
case 2:
return GREEN;
case 3:
return BLUE;
default:
return null;
}
}
@Override
public String toString() {
return "Color{" +
"title='" + title + '\'' +
'}';
}
}
public class MeiJu {
public static void main(String[] args) {
System.out.println(Color.getInstance(2));
}
}
以上做法是在JDK1.5以前的做法,这样做的目的是限制本类实例化对象的产生个数。但是从JDK1.5开始有了枚举,上述代码可以使用枚举来取代。
2. Enum类
虽然JDK1.5提供了enum关键字,但是enum并不是一种新的结构,相反,它只是对一种类型的包装:使用enum关键字定义的枚举类本质上就相当于一个Class定义的类,继承了java.lang.Enum
父类,单继承关系,不能再继承其他类。
- 在
Enum
类里面有以下方法: - 使用枚举对象:
枚举类.属性
- 构造方法:
protected Enum(String name, int ordinal);
- 取得枚举对象的名称:
public final String name();
- 取得枚举序号:
public final int ordinal();
package www.testdemo;
enum Color {
RED, BLUE, GERRN
}
public class MeiJu {
public static void main(String[] args) {
System.out.println(Color.BLUE.ordinal() + "=" +Color.BLUE.name());
}
}
- 接着试着把三种颜色的顺序调整一下,看看结果会不会发生变化?
package www.testdemo;
enum Color {
RED, GERRN, BLUE
}
public class MeiJu {
public static void main(String[] args) {
System.out.println(Color.BLUE.ordinal() + "=" +Color.BLUE.name());
}
}
通过以上代码我们会发现,所有的枚举类默认继承于Enum
类。而且枚举对象的ordinal()
方法在开发中要避免使用,它的值基于枚举对象定义的顺序!!!
- 列举所有的枚举对象:
枚举类.values()
,例如Color.values();
package www.testdemo;
enum Color {
RED, GERRN, BLUE
}
public class MeiJu {
public static void main(String[] args) {
for (Color temp : Color.values()) {
System.out.println(temp.ordinal()+" = " +());
}
}
}
面试题:请解释enum与Enum区别。
enum
是一个关键字,使用enum定义的枚举类本质上就相对于一个类继承了Enum
这个抽象类而已。
3. 定义结构
枚举类型是一个典型的多例设计,每个枚举对象都是有且只有一个。但是多例设计是在一个类中产生的,所以该类中可以定义更多的属性或方法。所以在枚举设计的时候考虑到这些因素,提出了更为全面的设计方案:可以在枚举中定义属性、方法、实现接口。
package www.testdemo;
interface IColor {
//返回颜色的RGB字符串表示的值
String getColorRGB();
}
//枚举实现接口
enum Color implements IColor {
RED("#0000ff"),
GREEN("#00ff00"),
BLUE("#00ff11"),
YELLOW("#ff000");
private String rgb;
Color(String rgb) {
this.rgb = rgb;
}
public String getRgb() {
return rgb;
}
public void print() {
System.out.println(this + " 颜色的RGB " + this.getRgb());
}
@Override
public String getColorRGB() {
return this.rgb;
}
}
public class MeiJu {
public static void main(String[] args) {
//直接通过 枚举.属性 调用
IColor color = Color.RED;
System.out.println(color.getColorRGB());
}
}
4. 枚举应用
枚举的最大特点是只有指定的几个对象可以使用。
这样我们就可以把性别分装成一个枚举类,它能产生对象的个数是一定的,假设能产生三个对象,分别是男、女和未知。
package www.testdemo;
class Person {
private String name;
private Integer age;
private Gender gender;
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
}
enum Gender {
//实际开发中需要根据业务情况决定此处枚举对象的数量
MALE("男"),
FEMALE("女");
private String flag;
//构造方法
Gender(String flag) {
this.flag = flag;
}
public String getFlag() {
return flag;
}
}
public class MeiJu {
public static void main(String[] args) {
Person person = new Person();
person.setName("Jack");
person.setAge(21);
person.setGender(Gender.MALE);
System.out.println(person);
}
}
switch
除了可以支持数字、字符和字符串以外,还可以支持枚举类型
switch (person.getGender()) {
case MALE:
System.out.println("男同志");
break;
case FEMALE:
System.out.println("女同胞");
break;
default:
System.out.println("未知");
}