枚举类
1、枚举
很多的编程语言都会提供有枚举的概念,但是Java一直到JDK1.5之后才提出了枚举的概念
在实际的开发之中,枚举的实际作用是用于定义有限个数对象的一种结构(多例设计),枚举就属于多例设计,并且其结构要比多例设计更加简单
枚举的定义
从JDK1.5之后在程序之中提供有enum的关键字,利用此关键字可以实现美剧的定义。
例:定义一个枚举类
enum Color{ //枚举类
RED,GREEN,BLUE; //实例化对象
}
public class JavaDemo{
public static void main(String args []){
Color color = Color.RED; //获取实例化对象
System.out.println(color);
}
}
如果此时采用了多例设计模式来进行设计,那么需要编写很多程序代码,这样对于开发的复杂度是比较高的
因为多例设计模式牵扯到了构造方法的私有化以及静态方法。
多例设计与枚举设计虽然可以实现相同的功能,但是使用枚举可以在程序编译的时候就判断所使用的实例化对象是否存在。
在进行枚举处理的时候还可以利用values()方法获取所有的枚举对象进行输出。
例:获取所有的枚举对象
enum Color{ //枚举类
RED,GREEN,BLUE; //实例化对象
}
public class JavaDemo{
public static void main(String args []){
for(Color color : Color.values()){
System.out.println(color);
}
}
}
如果此时同样的功能需要通过多例设计来解决的话,那么就需要使用对象数组了
从JDK1.5追加了枚举结构之后,就可以在switch之中进行枚举项的判断
例:枚举与switch处理
enum Color{ //枚举类
RED,GREEN,BLUE; //实例化对象
}
public class JavaDemo{
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判断
2、Enum类
严格意义上来讲枚举并不属于一种新的结构,它的本质相当于是一个类,但是这个类默认会继承Enum类
Enum类的基本定义:
public abstranct class Enum<E extends Enum<E>>
extends Objects
implements Comparable<E>,Serializable
现在定义的枚举类的类型就是Enum中所使用的E类型
Enum类中定义的方法:
No | 方法名称 | 类型 | 用途 |
---|---|---|---|
1 | protected Enum(String name,int ordinal) | 构造 | 传入名字和序号 |
2 | public final String name() | 普通 | 获得对象名字 |
3 | public final int ordinal() | 普通 | 获得对象序号 |
观察Enum类的存在:
enum Color{ //枚举类
RED,GREEN,BLUE; //实例化对象
}
public class JavaDemo{
public static void main(String args []){
for(Color color : Color.values()){
System.out.println(color.ordinal() + "---" + color.name());
}
}
}
在枚举之中每一个对象的序号都是根据枚举对象的定义顺序来决定的。
面试题:请解释enum和Enum的区别
- enum:是从JDK1.5之后提供的一个关键字,用于定义枚举类
- Enum:是一个抽象类,所以使用enum关键字定义的类就默认继承了此类
3、定义枚举结构
一直在强调枚举本身就水域一种多例设计模式,那么既然是多例设计模式,那么在一个类之中可以定义的结构是非常多的
例如:构造方法、普通方法、属性等,那么这些内容在枚举类中依然可以直接定义,但是需要注意的是,枚举类中定义的构造方法不能够采用非私有化定义
例:在枚举类中定义其他的结构
enum Color{ //枚举类
? RED("红色"),GREEN("绿色"),BLUE("蓝色"); //枚举对象要写在首行
? private String title;
? private Color(String title){
? this.title = title;
? }
? public String toString(){
? return title;
? }
}
public class JavaDemo{
public static void main(String args []){
for(Color color : Color.values()){
System.out.println(color.ordinal() + "---" + color.name() + "---" + color);
}
}
}
本程序在简化程度上一定要远远高于多例设计模式。处理这种基本的结构之外,在枚举类中也可以实现接口的继承
例:让枚举实现继承
interface IMessage{
String getMessage();
}
enum Color implements IMessage{ //枚举类
RED("红色"),GREEN("绿色"),BLUE("蓝色"); //枚举对象要写在首行
private String title;
private Color(String title){
this.title = title;
}
public String toString(){
return title;
}
public String getMessage(){
return title;
}
}
public class JavaDemo{
public static void main(String args []){
IMessage message = Color.RED;
System.out.println(message.getMessage());
}
}
枚举类中可以直接定义抽象方法,枚举的定义是十分灵活的
但是在实际应用中不建议在枚举类中定义抽象方法
在使用枚举类时,更多情况下还是建议使用它的正确用法,就是定义实例对象即可!
4、枚举应用案例
现在定义一个Person类,里面一定有性别,性别肯定不希望用户随意输入,所以使用枚举最合适
enum Sex{
MAN("男"),WOMAN("女");
private String title;
private Sex(String title){
this.title = title;
}
public String toString(){
return 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("沈梦琳",18,Sex.WOMAN));
}
}
这个程序就算不使用枚举也可以实现,追加几个判断即可
所以对于枚举,愿意用就用户,不愿意用就不用,并非严格要求,但要看懂,以防止其他人的代码中出现枚举时看不懂的情况