java刚开始没有枚举的概念,所以开发者不得不使用多例设计模式代替枚举。jdk1.5枚举
10.4.1定义枚举类
关键字:enum,利用此关键字实现枚举类型定义,利用枚举可以简化多例设计模式的定义
范例:定义枚举类型
public enum Color235 {
RED,GREEN,BLUE;
}
public class Java235A {
public static void main(String[] args) {
Color235 d=Color235.RED;
System.out.println(d);
}
}
执行结果:RED
直接利用枚举名称进行对象的调用
提示:关于枚举名称的定义
在上个程序,所有枚举类的对象名称全部采用了大写字母定义,这一点是符合多例设计模式要求的,同时枚举对象的名称也可以采用中文的形式进行定义
范例:利用中文定义枚举对象名称
public enum ColorChinese {
红色,绿色,蓝色;
}
public class JavaChinese {
public static void main(String[] args) {
ColorChinese c=ColorChinese.红色;
System.out.println(c);
}
}
执行结果
红色
直接使用类名称.汉字。枚举最为重要的特点就是可以简化多例设计模式的结构
枚举除了简化多例设计模式之外,也提供了方便的信息获取操作,利用**枚举类.values()**结构可以以对象数组的形式获取枚举中的全部对象。
范例:输出枚举中的全部内容
public enum Color235B {
javase,javaweb,数据结构,框架;
}
public class Java235B {
public static void main(String[] args) {
for(Color235B c:Color235B.values()) {
System.out.print(c+"、");
}
}
}
执行结果:
javase、javaweb、数据结构、框架、
本程序利用values()方法获取了Color235B中的全部枚举对象,随后利用foreach循环获取每一对象并进行输出。
之所以采用枚举来代替多例设计模式的一个很重要的原因在于,可以直接在switch语句中进行枚举对象类型判断。
范例:在switch中判断枚举类型
public enum Color235 {
RED,GREEN,BLUE;
}
public class Java236 {
public static void main(String[] args) {
Color235 c=Color235.RED;
switch(c) { //支持枚举判断
case RED: //匹配内容
System.out.println("红色");
break;
case GREEN: //匹配内容
System.out.println("绿色");
break;
case BLUE: //匹配内容
System.out.println("蓝色");
break;
}
}
}
本程序直接在switch中可以实现枚举对象的匹配,而如果使用多例设计模式,则只能通过大量的if语句的判断来进行内容的匹配与结果输出。
提示:关于switch允许操作的数据类型
JDK1.5之前:只支持Int或Char型数据
JDK1.5之后:增加enum型数据
JDK1.7之后:增加String型数据
10.4.2Enum类
枚举并不是一个新的类型,他只是提供了一种更为方便的结构。严格来讲,每一个使用enum定义的类实际上都属于一个类继承了Enum父类而已,而java.lang.Enum类定义如下
public abstract class Enum<E extends Enum<E>>
extends Object implements Comparable<E>, Serializable {}
在Enum类中定义其可以支持的泛型上限,同时在Enum类中提供如表常用方法
方法名称 | (类型)描述 |
---|---|
protected Enum(String name,int ordinal) | (构造)传入对象和序号 |
public final String name() | (普通)获得对象名字 |
public final int ordinal() | (普通)获得对象序号 |
Enum类中的构造方法使用了protected访问权限,实际上这也属于构造方法的封装实现。同时在实例化每一个枚举对象时都可以自动传递一个对象名称以及序号。
范例:观察enum关键字与Enum类之间的联系
public enum Color235 {
RED,GREEN,BLUE;
}
public class Java237 {
public static void main(String[] args) {
for(Color235 c:Color235.values()) {
System.out.println(c.ordinal()+"-"+c.name());
}
}
}
程序结果
0-RED
1-GREEN
2-BLUE
在本程序中每输出一个枚举类对象时都调用了Enum类中定义的ordinal()与name()方法来获取相应的信息,所以可以证明,enum定义的枚举类将默认继承Enum类。
10.4.3定义枚举结构
枚举中也可以定义成员属性,构造方法,普通方法。但是枚举本质上属于多例设计模式,所以构造方法不允许使用public进行定义。如果类中没有提供无参构造方法,则必须在定义每一个枚举对象时明确传入参数内容。
范例:在枚举类中定义成员属性与方法
public enum Color237 { //枚举类
RED("红色"),GREEN("绿色"),BLUE("蓝色");//枚举对象要写在首行
private String title; //成员属性
private Color237(String title) { //构造方法初始化属性
this.title=title;
}
@Override
public String toString() {
return this.title;
}
}
public class Java238A {
public static void main(String[] args) {
for(Color237 c:Color237.values()) {
System.out.println(c.ordinal()+"-"+c.name()+"-"+c);
}
}
}
执行结果
0-RED-红色
1-GREEN-绿色
2-BLUE-蓝色
在枚举结构中定义了构造方法并且覆写了Object类中的toString()方法,可以发现在java中已经将枚举结构的功能进行了扩大,使其与类结构更加贴近。
范例:通过枚举类实现接口
public interface IMessage {
public String getMessage();
}
public enum Color238 implements IMessage { //枚举类实现接口
RED("红色"),GREEN("绿色"),BLUE("蓝色"); //枚举对象要写在首行
private String title; //成员属性
private Color238(String title) { //构造方法初始化属性
this.title=title;
}
@Override
public String getMessage() { //方法覆写
return this.title;
}
}
public class Java238 {
public static void main(String[] args) {
IMessage msg=Color238.BLUE;
System.out.println(msg.getMessage());
}
}
执行结果
蓝色
本程序让枚举实现了IMessage接口,这样就需要在枚举类中覆写接口中的抽象方法,由于Color238是IMessage的接口子类,所以每一个枚举类对象都可以通过对象的向上转型实现IMessage接口对象实例化。
枚举还有一个特别的功能就是可以直接进行抽象方法的定义,此时可以在每一个枚举对象中分别实现此抽象方法。
范例:在枚举中定义抽象方法
package com.lxh.tenchapter;
public enum Color239 {
RED("红色"){
@Override
public String getMessage() { //覆写抽象方法
return "【RED】"+this;
}
},GREEN("绿色"){
@Override
public String getMessage() {
return "【RREEN】"+this;
}
},BLUE("蓝色"){
@Override
public String getMessage() {
return "【BLUE】"+this;
}
};
private String title;
private Color239(String title) {
this.title=title;
}
public String toString() { //输出对象信息
return this.title;
}
public abstract String getMessage(); //直接定义抽象方法
}
public class Java239 {
public static void main(String[] args) {
System.out.println(Color239.BLUE.getMessage());
}
}
执行结果
【BLUE】蓝色
本程序在枚举中利用abstract关键字定义了一个抽象方法,这样就必须在每一个枚举类对象中分别覆写此抽象方法。
10.4.4枚举应用案例
枚举主要是定义了实例化对象的使用范围 ,同时枚举类型也可以作为成员属性类型。例如,现在定义一个Person类,里面需要提供性别属性,而性别不希望用户随便输入,所以使用枚举最合适。
范例:枚举结构应用
public enum Sex {
NAM("男"),WOMAN("女");
private String title;
private Sex(String title) {
this.title=title;
}
public String toString() { //获取对象信息
return this.title;
}
}
public class Person {
private String name;
private int age;
private Sex sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Sex getSex() {
return sex;
}
public void setSex(Sex sex) {
this.sex = sex;
}
public Person(String name, int age, Sex sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "Person [姓名=" + name + ", 年龄=" + age + ", 性别=" + sex + "]";
}
}
public class Java240 {
public static void main(String[] args) {
Person per=new Person("李明",20,Sex.NAM);
System.out.println(per);
}
}
执行结果
Person [姓名=李明, 年龄=20, 性别=男]
本程序定义Person类时使用了枚举类型,在实例化Person类对象时就可以限定Sex对象的取值范围。