枚举
背景:很多编程语言都会提供有枚举的概念,但是在JDK1.5之后才提出了所谓枚举的概念。在实际的开发之中枚举的主要作用是用于定义有限个数对象的一种结构(多例设计),枚举就属于多例设计。并且其结构要比多例设计更简单。
1:定义一个枚举类
enum Color{
RED,GREEN,BLUE;//实例化对象
}
public class Test{
public static void main(String args[]) {
Color c = Color.BLUE;
System.out.print(c);
}
}
如果此时采用多例设计模式,则需要编写很多的程序代码,这样对于开发的复杂度是比较高的(因为涉及构造方法的私有化以及静态方法);多例设计和枚举设计虽然可以实现相同的功能,但是使用枚举可以在程序编译的时候就判断所使用的实例化对象是否存在。
2:利用values()方法获取所有的枚举对象进行输出
enum Color{
RED,GREEN,BLUE;//实例化对象
}
public class Test{
public static void main(String args[]) {
for(Color c:Color.values()){
System.out.println(c);
}
}
}
//RED
//GREEN
//BLUE
如果此时同样的功能需要通过多例设计的话,就需要使用对象数组了
3:观察枚举与switch处理
enum Color{
RED,GREEN,BLUE;//实例化对象
}
public class Test{
public static void main(String args[]) {
Color c = Color.RED;
switch(c) {//直接支持枚举
case RED:
System.out.print("红色");
break;
case BLUE:
System.out.print("蓝色");
break;
case GREEN:
System.out.print("绿色");
break;
}
}
}
//红色
多例是无法实现这种与switch直接连接的,多例是想实现它就需要编写大量的if判断。
4:Enum类
枚举并不属于一种新的结构,它的本质相当于是一个类,但是这个类会默认继承Enum类
enum Color{//枚举类
RED,GREEN,BLUE;//实例化对象
}
public class Test{
public static void main(String args[]) {
for(Color c:Color.values()){
System.out.println(c.ordinal()+"-"+c.name());
}
}
}
//0-RED
//1-GREEN
//2-BLUE
5:定义枚举结构
枚举本身就属于一种多例设计模式,那么既然是多例设计模式,那么在一个类之中可以定义的结构是非常多的。有:构造方法,普通方法,属性等,那么这些内容在枚举类中依然可以直接定义,但是需要注意:枚举类中定义的构造方法不能够采用非私有化定义(public无法使用)。
enum Color{//枚举类
RED("红色"),GREEN("绿色"),BLUE("蓝色");//枚举对象要写在首行
private String title;//定义属性
private Color(String title) {
this.title=title;
}
public String toString() {
return this.title;
}
}
public class Test{
public static void main(String args[]) {
for(Color c:Color.values()){
System.out.println(c.ordinal()+"-"+c.name());
}
}
}
//0-RED
//1-GREEN
//2-BLUE
上述程序在简化程度上一定要远远高于设计模式。
6:让枚举实现接口
在枚举中也可以实现接口的继承。
interface IMessage{
public String getMessage();
}
enum Color implements IMessage{//枚举类
RED("红色"),GREEN("绿色"),BLUE("蓝色");//枚举对象要写在首行
private String title;//定义属性
private Color(String title) {
this.title=title;
}
public String toString() {
return this.title;
}
public String getMessage() {
return this.title;
}
}
public class Test{
public static void main(String args[]) {
IMessage msg = Color.RED;
System.out.println(msg.getMessage());
}
}
//红色
7:观察枚举中定义抽象方法
enum Color {//枚举类
RED("红色"){
public String getMessage() {
return this.toString();
}
},GREEN("绿色"){
public String getMessage() {
return this.toString();
}
},BLUE("蓝色"){
public String getMessage() {
return this.toString();
}
};//枚举对象要写在首行
private String title;//定义属性
private Color(String title) {
this.title=title;
}
public String toString() {
return this.title;
}
public abstract String getMessage() ;
}
public class Test{
public static void main(String args[]) {
System.out.println(Color.RED.getMessage());
}
}
//红色
实际的使用之中,枚举更多情况下还是建议使用它的正确做法,就是定义一个实例对象即可。
8:枚举的实际应用
定义一个Person类,里边有性别,性别不希望用户随便输入,所以用枚举最合适。
enum Sex{
MALE("男"),FEMALE("女");
private String title;
private Sex(String title) {
this.title=title;
}
public String toString() {
return this.title;
}
}
class Person{
private String name;
private int age;
private Sex sex;
public Person(String name,int age,Sex sex) {
this.name=name;
this.age=age;
this.sex=sex;
}
public String toString() {
return "姓名:"+this.name+"年龄"+this.age+"性别:"+this.sex;
}
}
public class Test{
public static void main(String args[]) {
System.out.print(new Person("aa",20,Sex.MALE));
}
}
//姓名:aa年龄20性别:男
这个程序实际上不使用枚举也可以实现 ,追加几个判断即可,所以对于枚举,用不用自己决定。