定义枚举类
枚举是特殊的多例设计,其与表达意义相同。在jdk1.5之后提供enum关键字,利用此关键字可以实现枚举定义。
例子:定义一个枚举
package a.a.a;
enum Color{ //枚举
红色,绿色,蓝色;//实例化对象
}
public class Java {
public static void main(String[] args) {
Color x=Color.红色;
System.out.println(x);
}
}
此时采用多列设计模式会涉及很多代码,其中涉及到了构造方法私有化,静态方法等。多例设计与枚举实现相同效果,但是枚举可以在编译过程中检测到实例化对象是否存在*。
例子:枚举定义有方法可以获取所以实例化对象的值
package a.a.a;
enum Color{ //枚举
红色,绿色,蓝色;//实例化对象
}
public class Java {
public static void main(String[] args) {
for (Color x:Color.values() ){
System.out.println(x);
}
}
}
输出:
红色
绿色
蓝色
例子:观察枚举与switch进行判断处理
package a.a.a;
enum Color{ //枚举
红色,绿色,蓝色;//实例化对象
}
public class Java {
public static void main(String[] args) {
Color x=Color.红色;
switch(x){ //直接枚举
case 红色:
System.out.println("red");
break;
case 绿色:
System.out.println("green");
break;
case 蓝色:
System.out.println("blue");
break;
}
}
}
输出:red
Enum类
严格意义上枚举并不属于一种新的结构,其本质相当于一个类,这个类默认继承了Enum类。Enum类定义如下:
public abstract class Enum<E extends Eunm>
extends Object
implements Comparable,Serializable
现在定义的枚举类的类型就是Enum中所使用的E类型。
例子:观察Enum类存在
package a.a.a;
enum Color{ //枚举
红色,绿色,蓝色;//实例化对象
}
public class Java {
public static void main(String[] args) {
for (Color x:Color.values()){
System.out.println(x.ordinal()+"--"+x.name()); //输出序号和名称
}
}
}
输出结果:
0–红色
1–绿色
2–蓝色
序号是根据对象的顺序发生变化的。
观察enum与Enum的区别?
·enum从jdk1.5之后提供的关于定义枚举的关键字;
·Enum是一个无法直接看见的抽象类,使用enum关键字定义的类就默认继承了此类。
定义枚举结构
枚举本身属于一种多例设计模式,那么在一个类的定义的结构非常多。例如:构造方法、普通方法、属性等。这些内容可以在枚举直接定义,但是需要注意的是多例设计中构造方法私有化,枚举类中定义的构造方法不能非私有化定义(即public不可使)。
例子:枚举类中定义多种结构
package a.a.a;
enum Color{ //枚举类
红色(""),绿色("绿"),蓝色("蓝");//实例化对象枚举对象,必须写在第一行
private String title;
private Color(String title){
this.title=title;
}
public String toString(){
return this.title;
}
}
public class Java {
public static void main(String[] args) {
for (Color x:Color.values()){
System.out.println(x.ordinal()+"--"+x.name()+"--"+x);
}
}
}
输出结果:
0–红色–红
1–绿色–绿
2–蓝色–蓝
除了基本结构之外,枚举也可以实现接口继承。
例子:枚举实现接口
package a.a.a;
interface IMessage{
public String getMessage();
}
enum Color implements IMessage{ //枚举类
红色("红色"),绿色("绿色"),蓝色("蓝色");//实例化对象枚举对象,必须写在第一行
private String title;
private Color(String title){
this.title=title;
}
public String toString(){
return this.title;
}
public String getMessage(){
return this.title;
}
}
public class Java {
public static void main(String[] args) {
IMessage x=Color.红色;
System.out.println(x.getMessage());
}
}
枚举可以直接定义在抽象方法,并且要求每一个枚举对象独立覆写实现此方法。
枚举应用案例
假设现在定义有一个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 Java {
public static void main(String[] args) {
Person a=new Person("温情",19,Sex.FEMALE);
System.out.println(a.toString());
System.out.println(new Person("温宁",18,Sex.MALE).toString());
}
}
输出结果:
姓名:温情、年龄:19、性别:女
姓名:温宁、年龄:18、性别:男