很多的编程语言里面实际上都存在有枚举的概念,但是Java一直到JDK1.5之后才可以正式推出枚举这一概念,在这之前枚举的概念只能够通过多例设计模式来描述。
了解单例和多例点这里
一、枚举的基本定义
在JDK1.5之后提供有一个enum的关键字,该关键字的主要作用就是实现枚举类的定义,同时在进行枚举类定义的时候一定要遵循一些多例设计模式原则(构造方法私有、内部要提供有若干个对象常量)
**例:**定义枚举
enum Color { //颜色基色的枚举
RED, GREEN, BLUE; //多例设计中的对象是常量必须大写
}
public class TestEnum {
public static void main(String[] args) {
Color red = Color.RED; //直接获取枚举对象
System.out.println(red);
}
}
程序执行结果:
RED
(默认获取的就是枚举名称)
使用enum定义的枚举类可以方便的通过valuesO静态方法获取全部的枚举定义内容。
例:使用values()获取全部枚举信息
enum Color { //颜色基色的枚举
RED, GREEN, BLUE; //多例设计中的对象是常量必须大写
}
public class TestEnum {
public static void main(String[] args) {
for (Color color : Color.values()) { //Color.values() 返回对象数组
System.out.println(color);
}
}
}
程序执行结果:
RED
GREEN
BLUE
当枚举结构出现之后switch语句也同时发生了改变,switch在最早推出的时候只支持数字和字符,在JDK1.5之后支持枚举,在JDK1.7之后支持字符串。
**例:**结合switch使用枚举
enum Color { //颜色基色的枚举
RED, GREEN, BLUE; //多例设计中的对象是常量必须大写
}
public class TestEnum {
public static void main(String[] args) {
Color color=Color.RED;
switch (color){
case RED:
System.out.println("红色");
break;
case GREEN:
System.out.println("绿色");
break;
case BLUE:
System.out.println("蓝色");
break;
}
}
}
程序执行结果:
红色
如果此时使用的是传统的多例设计模式,对于此时的代码将无法使用switch进行判断处理,只能够if.else 调用equals()方法进行比较。
二、Enum类
从严格意义上来讲枚举并不算是一种新的类型结构,使用enum定义的枚举类本质上就相当于利用class定义的类并且继承了Enum父类结构。
这个类的定义如下:
public abstract class Enum<E extends Enum> extends Objectimplements Comparable, Serializable
观察一下Enum类的构造方法定义:
protected Enum(String name, int ordinal)
对于Enum类的构造方法本身使用的就是一个封装的操作形式,同时在这个构造方法里面会传递两个内容:
名称、序号,
名称就是定义的枚举名字,在Enum类里面实际上也定义了两个普通方法可以获取枚举对象的信息。
·获取名称: String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
·获取序号: int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
例:观察枚举方法调用
enum Color { //颜色基色的枚举
RED, GREEN, BLUE; //多例设计中的对象是常量必须大写
}
public class TestEnum {
public static void main(String[] args) {
Color color[]=Color.values();
for (Color color1 : color) {
System.out.println(color1.name()+"--"+color1.ordinal());
}
}
}
程序执行结果:
RED–0
GREEN–1
BLUE–2
枚举定义的顺序就是其序号保存的顺序,也就是说枚举里面所有的对象都会默认调用Enum父类的构造方法,而这一切都是由JVM在编译的时候自己完成的处理。
面试题:请解释enum和Enum的区别?
- enum是JDK1.5之后提供的一个关键字,主要进行枚举定义,而使用enum定义的枚举类默认都继承自Enum抽象父类。
三、定义枚举结构
枚举的本质就是进行多例设计模式的替代,但是类中可以定义的结构绝对要比现在的枚举类丰富,也比其他语言的枚举类丰富(Java将枚举的功能做了进一步的提升)。
1、在枚举中定义属性、构造、覆写方法
enum Color { //颜色基色的枚举
RED("红色"), GREEN("绿色"), BLUE("蓝色"); //多例设计中的对象是常量必须大写
//枚举中的其它结构必须定义在枚举类对象之后
private String info;
private Color (String info){
this.info = info;
}
@Override
public String toString() {
return this.info;
}
}
public class TestEnum {
public static void main(String[] args) {
System.out.println(Color.RED);
}
}
程序执行结果:
红色
枚举设计的本质就在替代原始的多例设计模式复杂结构,而当可以在枚举类中定义更多的结构时,这种替代就更加明显了。除了定义类的基本结构之外,在枚举中也可以实现接口。
**例:**枚举实现接口
interface IMessage{
String getInfo();
}
enum Color implements IMessage{ //颜色基色的枚举
RED("红色"), GREEN("绿色"), BLUE("蓝色"); //多例设计中的对象是常量必须大写
//枚举中的其它结构必须定义在枚举类对象之后
private String info;
private Color (String info){
this.info = info;
}
@Override
public String toString() {
return this.info;
}
@Override
public String getInfo() { //方法覆写
return this.info;
}
}
public class TestEnum {
public static void main(String[] args) {
IMessage msg = Color.RED;
System.out.println(msg);
}
}
程序执行结果:
红色
在枚举设计的时候还允许类中定义抽象方法,此时要求每一个枚举对象都必须覆写此抽象方法。
**例:**枚举定义抽象方法
enum Color { //颜色基色的枚举
RED("红色"){
public String getInfo() {
return "红色";
}
}, GREEN("绿色"){
public String getInfo() {
return "绿色";
}
}, BLUE("蓝色"){
public String getInfo() {
return "蓝色";
}}; //多例设计中的对象是常量必须大写
//枚举中的其它结构必须定义在枚举类对象之后
private String info;
private Color (String info){
this.info = info;
}
public abstract String getInfo();//枚举定义抽象方法
@Override
public String toString() {
return this.info;
}
}
public class TestEnum {
public static void main(String[] args) {
System.out.println(Color.RED.getInfo());
}
}
程序执行结果:
红色
Java中的枚举设计已经是足够完善的了,所以它可以在枚举类中任意追加结构,但是考虑到实际的应用,一般都是以枚举的名称为主进行的判断。
四、枚举的实际应用
枚举的出现替代了多例设计,在实际之中只要有限制对象个数的情况就都可以通过枚举来完成。
例:描述一个人类的信息
enum Sex {
MAN("男"), FEMALE("女");
private String info;
private Sex(String info) {
this.info = info;
}
public String toString() {
return this.info;
}
}
class Member {
private String name;
private int age;
private Sex sex; //枚举类型
public Member(String name, int age, Sex sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "姓名:"+this.name+" 年龄:"+this.age+" 性别:"+this.sex;
}
}
public class TestEnum {
public static void main(String[] args) {
Member member = new Member("哈哈",18,Sex.MAN);
System.out.println(member);
}
}
程序执行结果:
姓名:哈哈 年龄:18 性别:男
本程序不使用枚举也可以正常实现,所以实际上枚举的出现并没有为那些传统的Java开发人员带来绝对性的方便但是在日后的类库里面会有许多的枚举类型出现。