
枚举能用就用,不能用就别用。
1.枚举的基本用法
2.枚举的定义组成
先观察以下三原色的多例模式代码:
class Color{
private String title;
private static final Color RED=new Color("Red Color");
private static final Color GREEN=new Color("Green Color");
private static final Color BLUE=new Color("Blue Color");
private Color(String title){
this.title=title;
}
@Override
public String toString() {
return this.title;
}
public static Color getInstance(int ch){
switch(ch){
case 1:
return RED;
case 2:
return GREEN;
case 3:
return BLUE;
default:
return null;
}
}
}
public class TestDemo {
public static void main(String[] args) {
Color red=Color.getInstance(1);
System.out.println(red);
}
}
结果:

但是以上代码太多了,因而2005年以后 java增加enum关键字来支持枚举。
以上代码化成枚举:
enum Color{//定义了枚举类型
RED,GREEN,BLUE;//表示此处为实例化对象
}
public class TestDemo {
public static void main(String[] args) {
Color red=Color.RED;
System.out.println(red);
}
}
同样满足结果,所以我们发现,可以使用枚举完全简化替代多例设计模式。
需要注意的是,严格来讲,枚举并不是一个新的功能,用enum关键字定义的枚举类型就相当于一个类继承了Enum类而已。
翻阅JDK1.8文档
public abstract class Enum<E extends Enum<E>> extends Object
枚举类型接收所有枚举类型的子类泛型作为泛型。
Enum是一个抽象类,里面定义的构造如下。
protected Enum(String name,int ordinal)
Enum类的构造方法依然是被封装的,所以也属于构造方法私有化的应用范畴,所有的多例设计模式都必须构造方法私有化。
Enum类中定义了两个方法:
1.取得枚举的名字:
public final String name();
2.取得枚举的索引:
public final int ordinal();
除了以上的两个方法,还有一个value方法,这个方法将枚举对象以对象数组的形式全部返回。
改变示例代码:
enum Color{//定义了枚举类型
RED,GREEN,BLUE
}
public class TestDemo {
public static void main(String[] args) {
for (Color c : Color.values()) {
System.out.println(c.ordinal()+"."+c.name());
}
}
}

总结:
1.enum是一个关键字,Enum是抽象类
2.使用enum定义的枚举就相当于一个类继承了Enum这个抽象类
使用枚举定义其它结构
注意点:枚举之中定义的构造方法不能够使用public声明,如果没有无参构造,手动调用构造传递参数
枚举对象必须要放在首行,随后才可以定义属性,构造,普通方法
范例:扩充枚举功能:
enum Color{
RED("hongse"),GREEN("lvse"), BLUE("lanse");//实例化的枚举对象
private String title;//属性
private Color(String title){
this.title=title;
}
public String toString(){
return this.title;
}
}
public class TestDemo {
public static void main(String[] args) {
for (Color c : Color.values()) {
System.out.println(c);//直接输出调用toString
}
}
}
此时结果和之前定义多例设计模式操作方式就完全相同,而且代码更加的简单。枚举还可以实现接口。
范例:枚举实现接口:
interface Message{
public String getTitle();
}
enum Color implements Message{
RED("hongse"),GREEN("lvse"), BLUE("lanse");//实例化的枚举对象
private String title;//属性
private Color(String title){
this.title=title;
}
public String getTitle(){
return this.title;
}
public String toString(){
return this.title;
}
}
public class TestDemo {
public static void main(String[] args) {
for (Color c : Color.values()) {
System.out.println(c.getTitle());//直接输出调用toString
}
}
}
此外还能定义抽象类。
枚举的实际作用:
1.用于switch的选择判断(了解,不使用)
enum Color implements Message{
RED,GREEN,BLUE;//实例化的枚举对象
}
public class TestDemo {
public static void main(String[] args) {
Color c=Color.RED;
switch(c){
case RED:
System.out.println("Red Color");
break;
case GREEN:
System.out.println("Green Color");
break;
case BLUE:
System.out.println("Blue Color");
break;
}
}
}
总结
1.枚举属于高级的多例设计模式
2.一般C语言开发者习惯使用枚举,别的不熟悉的不建议使用了。