简述
从 2005 年之后,Java 增加了枚举的概念,同时增加了一个 enum 的关键字。在大多数情况下,Java 类 的对象是优先而且固定的,例如季节(只有春、夏、秋、冬)四个对象。像这种有限而且固定的类,就被称为枚举类。
详解
在我们没有接触到 枚举类的时候,如果是需要做的类似枚举的功能,就会用到 多例模式。
多例设计模式:
构造方法私有化,而后在类的内部提供若干个实例化对象,并且 通过 static 方法返回。
class Color {
private String title;
private static final Color RED = new Color("红色");
private static final Color BLUE = new Color("蓝色");
private static final Color GREEN = new Color("绿色");
private Color(String title) {
this.title = title;
}
public static Color getInstance(int ch) {
switch (ch) {
case 1:
return RED;
case 2:
return BLUE;
case 3:
return GREEN;
default:
return null;
}
}
@Override
public String toString() {
return this.title;
}
}
public class Demo {
public static void main(String[] args) {
Color c = Color.getInstance(1);
System.out.println(c); // 红色
}
}
上面的代码虽然是比较容易理解,但是实在是太啰嗦了。接着我们看看定义枚举(使用 enum 定义枚举):
英文定义
enum Color {// 定义枚举
RED, BLUE, GREEN;// 表示此处为实例化对象
}
public class Demo {
public static void main(String[] args) {
Color c = Color.RED;
System.out.println(c);
}
}
中文定义
我们不一般不这样子使用,只是说明可以使用中文。
enum Color {// 定义枚举
红色, 蓝色, 绿色;// 表示此处为实例化对象
}
public class Demo {
public static void main(String[] args) {
Color c = Color.蓝色;
System.out.println(c);
}
}
Enum 类
严格来讲枚举并不是一个新的功能,在 Java 中虽然使用了 enum 关键字定义了枚举,但是 enum 定义的枚举就相当于是一个类继承了 Enum 类而已。
Enum 类的定义:
public abstract class Enum<E extends Enum<E>>
extends Object
implements Comparable<E>, Serializable
Enum 类构造方法:
Enum 类的构造方法依然是被封装的,所以也属于构造方法私有化的应用范畴,所有的多例设计模式前提:构造方法私有化。
protected Enum(String name, int ordinal)
在Enum类里定义了两个方法:
- 取得枚举索引:
public final int ordinal();
- 取得枚举的名字:
public final String name();
enum Color {// 定义枚举
红色, 蓝色, 绿色;// 表示此处为实例化对象
}
public class Demo {
public static void main(String[] args) {
for (Color c : Color.values()) {
System.out.println(c.ordinal() + "-" + c.name());
}
}
}
enum 与 Enum 的区别?
- enum 是一个关键字,Enum 是一个抽象类。
- 使用 enum 定义的枚举就相当于一个类继承了 Enum 这个抽象类。