Java新特性——枚举

  • 多例设计模式与枚举
  • 使用枚举进行基本操作

多例设计模式与枚举

多例设计模式一定是构造方法私有化,而后在类的内部产生若干个实例化对象。
范例:定义颜色基色的多例设计模式

class Color{
	private static final Color RED = new Color("红色");
	private static final Color GREEN = new Color("绿色");
	private static final Color BLUE = new Color("蓝色");
	private String title;
	private Color(String title){
		this.title = title;
	}
	public String toString(){
		return this.title;
	}
	public static Color getInstance(int ch){
		switch(ch){
			case 0:
				return RED;
			case 1:
				return GREEN;
			case 2: 
				return BLUE;
			default:
				return null;
		}
	}
}
public class Hello{
	public static void main(String args[]) {
		Color c = Color.getInstance(1);
		System.out.println(c);
	}
}

麻烦,getInstance()方法没有意义,内部到底有多少个实例化对象不清楚。因此JDK1.5之后有了一个新的关键字:enum,利用这个关键字就可以实现与多例相同的功能。
范例:枚举

enum Color{
	RED,GREEN,BLUE;
}
public class Hello{
	public static void main(String args[]) {
		Color c = Color.GREEN;
		System.out.println(c);
	}
}

多例是枚举的设计来源,在多例设计模式之中,所有的对象一定都是static final定义的,那么就必须使用大写字母表示。在枚举里面最大的支持还在于可以实现所有枚举对象的遍历操作。
范例:枚举的遍历操作

enum Color{
	RED,GREEN,BLUE;
}
public class Hello{
	public static void main(String args[]) {
		for(Color c:Color.values()){//values(),返回对象数组
			System.out.println(c);
		}
	}
}

枚举本身就是为了解决多例设计模式。

java.lang.Enum

严格来讲使用enum定义的枚举类不属于新的结构,因为本质上就相当于一个类继承了java.lang.Enum类的形式。观察Enum类的定义形式:

public abstract class Enum<E extends Enum<E>> extends Object implements Comparable<E>,Serializable

而在Enum类中定义的构造方法:

protected	Enum(String name, int ordinal) 

只能够在本包或不同包的子类才可以调用,其实就是构造方法的封装。但是在这个构造方法中要接收两个参数:对象名字name、对象序号ordinal。
在Enum类中有两个方法可以取得名字和序号:

  • 取得名字:public final String name();
  • 取得序号:public final int ordinal()。
enum Color{
	RED,GREEN,BLUE;
}
public class Hello{
	public static void main(String args[]) {
		for(Color c:Color.values()){//values(),返回对象数组
			System.out.println(c.name()+"-->"+c.ordinal());
		}
	}
}

在这里插入图片描述
枚举中的序号都是根据枚举对象的定义顺序得来的。
面试题:请解释Enum与enum的区别?

  • enum是JDK1.5之后增加的一个关键字用于定义枚举;
  • java.lang.Enum是一个抽象类,使用enum定义的枚举本质就相当于一个类继承了Enum。

枚举中定义其他结构

枚举在Java中属于一种特殊的类,可是类中的组成是很丰富的:属性、方法、构造方法、实现接口、继承抽象类,这些功能枚举都有。

enum Color{
	RED("红色"),GREEN("绿色"),BLUE("蓝色");//枚举对象必须卸载首行
	private String title;//属性
	private Color(String title){//构造方法必须使用非public
		this.title = title;
	}
	public String toString(){
		return this.title;
	}
}
public class Hello{
	public static void main(String args[]) {
		for(Color c:Color.values()){//values(),返回对象数组
			System.out.println(c.name()+"-->"+c.ordinal()+"-->"+c);
		}
	}
}

在这里插入图片描述
除了可以定义一些基本结构之外,枚举也可以实现接口。对于接口的实现有两种模式。
范例:统一实现接口

interface IMessage{
	public String getColor();
}
enum Color implements IMessage{
	RED("红色"),GREEN("绿色"),BLUE("蓝色");//枚举对象必须卸载首行
	private String title;//属性
	private Color(String title){//构造方法必须使用非public
		this.title = title;
	}
	public String toString(){
		return this.title;
	}
	@Override
	public String getColor() {
		return this.title;
	}
}
public class Hello{
	public static void main(String args[]) {
		IMessage msg = Color.RED;
		System.out.println(msg.getColor());
	}
}

范例:每个枚举对象采用匿名内部类的方式实现接口

interface IMessage{
	public String getColor();
}
enum Color implements IMessage{
	RED("红色"){
		public String getColor(){
			return "红色";
		}
	},GREEN("绿色"){
		public String getColor(){
			return "绿色";
		}
	},BLUE("蓝色"){
		public String getColor(){
			return "蓝色";
		}
	};
	//枚举对象必须卸载首行
	private String title;//属性
	private Color(String title){//构造方法必须使用非public
		this.title = title;
	}
	public String toString(){
		return this.title;
	}
}
public class Hello{
	public static void main(String args[]) {
		IMessage msg = Color.RED;
		System.out.println(msg.getColor());
	}
}

最神奇的是枚举里面还可以定义抽象方法,同时每个枚举对象要单独实现抽象方法。
范例:枚举中定义抽象方法

enum Color{
	RED("红色"){
		public String getColor(){
			return "红色";
		}
	},GREEN("绿色"){
		public String getColor(){
			return "绿色";
		}
	},BLUE("蓝色"){
		public String getColor(){
			return "蓝色";
		}
	};
	//枚举对象必须卸载首行
	private String title;//属性
	private Color(String title){//构造方法必须使用非public
		this.title = title;
	}
	public String toString(){
		return this.title;
	}
	public abstract String getColor();
}
public class Hello{
	public static void main(String args[]) {
		System.out.println(Color.RED.getColor());
	}
}

以上纯属了解概念,别用。

枚举实际应用

枚举就是表示一个类的对象选用范围,那么下面定义一个表示人的类,里面有性别。
范例:实现枚举的应用

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 Hello{
	public static void main(String args[]) {
		System.out.println(new Person("张三",10,Sex.MALE));
	}
}

以上代码不用枚举也可以实现,不推荐用枚举。

总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值