定义枚举类
- 枚举的主要作用是用于定义有限个数对象的一种结构(多例设计),枚举就属于多例设计,并且其结构比多例设计更加简单;
- 程序之中有利用enum关键字可以实现枚举的定义;
//定义一个枚举
package demo;
enum Color { //枚举类
RED, GREEN, BLUE; //实例化对象
}
public class JavaDemo {
public static void main(String [] args) {
Color c = Color.RED;
System.out.println(c);
}
}
- 如果采用多例设计模式来进行设计需要编写很多代码,这样开发的复杂度比较高,因为里面牵扯到了个构造方法私有化以及静态方法;
- 多例设计和枚举虽然可以实现相同的功能,但是使用枚举可以在程序编译的时候就判断所使用的实例化对象是否存在;
- 在进行枚举处理的时候还可以利用values()方法获取所有的枚举对象进行输出;
//获取所有的额枚举对象
package demo;
enum Color { //枚举类
RED, GREEN, BLUE; //实例化对象
}
public class JavaDemo {
public static void main(String [] args) {
for(Color c : Color.values()) {
System.out.println(c);
}
}
}
- 从JDK1.5追加了枚举结构之后,就可以在switch之中进行枚举项的判断;
//观察枚举与switch的处理
package demo;
enum Color { //枚举类
RED, GREEN, BLUE; //实例化对象
}
public class JavaDemo {
public static void main(String [] args) {
Color c = Color.RED;
switch (c) { //直接支持枚举
case RED:
System.out.println("红色");
break;
case GREEN:
System.out.println("红色");
break;
case BLUE:
System.out.println("红色");
break;
}
}
}
- 多例上是无法实现这种与switch直接连接的,多例要想实现它就需要大量的if判断;
Enum类
- 严格意义上来讲枚举并不属于一种新的结构,它的本质相当于一个类,这个类默认会继承Enum类,观察Enum类的基本定义:
public abstract class Enum <E extends Enum<E>>
extends Object
implements Comparable<E>,Serializable
- 现在定义的枚举类的类型就是Enum中所使用的E类型,观察Enum类中定义的方法:
No. | 方法名称 | 类型 | 描述 |
---|---|---|---|
01 | protected Enum(String name, int ordinal) | 构造 | 传入名字和序号 |
02 | public final String name() | 普通 | 获得对象名字 |
03 | public final int ordinal() | 普通 | 获取对象序号 |
//观察Enum类的存在
package demo;
enum Color { //枚举类
RED, GREEN, BLUE; //实例化对象
}
public class JavaDemo {
public static void main(String [] args) {
for(Color c : Color.values()) {
System.out.println(c.ordinal() + " - " + c.name());
}
}
}
- 在枚举之中每一个对象的序号都是根据枚举对象的定义顺序来决定的;
- enum和Enum的区别:
- enum是JDK1.5之后提供的一个关键字,用来定义枚举类;
- Enum是一个抽象类,所有使用enum定义的类,就默认继承了此类;
定义枚举结构
- 一直在强调枚举本身属于一种多例设计模式,既然是多例设计模式,那么在一个类之中可以定义的结构是非常多的,例如:构造方法、普通方法、属性等,这些内容在枚举类中依然可以直接定义,但是需要注意的是:枚举类中定义的构造方法不能够非私有化定义(public无法使用);
//在枚举类中定义其他的结构
package demo;
enum Color { //枚举类
RED("红色"), GREEN("绿色"), BLUE("蓝色"); //枚举对象要写在首行
private String title;
private Color(String title) {
this.title = title;
}
public String toString() {
return this.title;
}
}
public class JavaDemo {
public static void main(String [] args) {
for(Color c : Color.values()) {
System.out.println(c.ordinal() + " - " + c.name() + " - " + c);
}
}
}
- 本程序在简化程度上一定远远高于多例设计模式,除了这种基本的结构之外,在枚举中也可以实现接口的继承;
//让枚举实现接口
package demo;
interface IMessage {
public abstract String getMessage();
}
enum Color implements IMessage{ //枚举类
RED("红色"), GREEN("绿色"), BLUE("蓝色"); //枚举对象要写在首行
private String title;
private Color(String title) {
this.title = title;
}
public String getMessage() {
return this.title;
}
public String toString() {
return this.title;
}
}
public class JavaDemo {
public static void main(String [] args) {
IMessage msg = Color.RED;
System.out.println(msg.getMessage());
}
}
- 在枚举类里面最有意思的是它可以直接定义抽象方法,并且要求每一个枚举对象都要独立覆写此抽象方法;
//观察枚举中定义抽象方法
package demo;
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 abstract String getMessage();
public String toString() {
return this.title;
}
}
public class JavaDemo {
public static void main(String [] args) {
System.out.println(Color.RED.getMessage());
}
}
- 枚举的定义是非常灵活的,但是在实际的使用当中,枚举更多情况下还是建议使用它的正确用法,就是定义一个实例对象即可;
枚举应用案例
定义一个Person类,里面一定有性别,性别肯定不希望用户随意输入,所以用枚举最合适;
//使用枚举
package demo;
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 JavaDemo {
public static void main(String [] args) {
System.out.println(new Person("张三", 20, Sex.MALE));
}
}
网友评论