说明
虽然发现枚举的定义比较简单,可是对于之前介绍的多例模式中还可以定义属性和方法。实际上枚举也可以。但是有以下几点要求:
- 枚举中定义的构造方法不能使用 public 声明。(多例模式需要将构造方法私有化。)
- 枚举对象必须要放在首行,随后才可以定义属性、构造、普通方法。
扩充枚举功能
使用下面的代码,与之前的多例设计模式操作的方式相同,但是代码要相对简洁。
enum Color {
// 定义枚举对象
RED("红色"),GREEN("绿色"),BLUE("蓝色");
private String title; // 枚举的属性
// 将构造器方法私有化
private Color(String title) {
this.title=title;
}
// 覆写 toString() 方法
@Override
public String toString() {
return this.title;
}
}
public class Demo {
public static void main(String[] args) {
for (Color c : Color.values()) {
System.out.println(c.ordinal() + "-" + c.name());
}
}
}
枚举实现接口
枚举是也是一个类,所有也具有类的相关属性,可以实现接口。
interface Message { // 定义一个接口
public String getTitle();
}
enum Color implements Message {
// 正常的枚举定义值
RED("红色"), GREEN("绿色"), BLUE("蓝色");
private String title;
private Color(String title) {
this.title = title;
}
// 覆写接口的方法
@Override
public String getTitle() {
return this.title;
}
@Override
public String toString() {
return this.title;
}
}
public class Demo {
public static void main(String[] args) {
Message msg = Color.BLUE;
System.out.println(msg.getTitle());
}
}
另一种接口实现
枚举中可以使用匿名内部类的形式实现抽象方法。
interface Message {
public String getTitle();
}
enum Color implements Message {
// 使用 匿名内部类的形式实现抽象方法
RED("红色") {
public String getTitle() {
return "自己的" + this;
}
},
GREEN("绿色") {
public String getTitle() {
return "自己的" + this;
}
},
BLUE("蓝色") {
public String getTitle() {
return "自己的" + this;
}
};
private String title;
private Color(String title) {
this.title = title;
}
@Override
public String toString() {
return this.title;
}
}
public class Demo {
public static void main(String[] args) {
Message msg = Color.BLUE;
System.out.println(msg.getTitle());
}
}
枚举内定义抽象方法
enum Color {
RED("红色") {
public String getTitle() {
return "自己的" + this;
}
},
GREEN("绿色") {
public String getTitle() {
return "自己的" + this;
}
},
BLUE("蓝色") {
public String getTitle() {
return "自己的" + this;
}
};
private String title;
private Color(String title) {
this.title = title;
}
@Override
public String toString() {
return this.title;
}
// 在枚举中定义抽象方法
public abstract String getTitle();
}
public class Demo {
public static void main(String[] args) {
System.out.println(Color.GREEN.getTitle());
}
}
枚举应用
枚举在 switch 中的使用。
enum Color {
RED, BLUE, GREEN;
}
public class Demo {
public static void main(String[] args) {
Color c = Color.GREEN;
switch (c) {
case RED:
System.out.println("红色");
break;
case GREEN:
System.out.println("绿色");
break;
case BLUE:
System.out.println("蓝色");
default:
break;
}
}
}