《Java编程思想》学习笔记16——枚举

1.在枚举中添加方法:

Java中的枚举是一种特殊的类,不但可以添加字段,构造方法,普通方法,甚至可以添加main()方法,例子如下:

public enum Test{
	//调用枚举构造方法创建枚举对象
	WEST(“Go west”), NORTH(“Go north”),
	EAST(“Go east”), SOUTH(“Go south”);
private String description;
	//私有构造方法
private Test(String description){
		this.description = description;
}
public String getDescription(){
	return description;
}
public static void main(String[] args){
	for(Test witch : Test.values()){
	System.out.println(witch + “: ” + witch.getDescription());
}
}
}

输出结果:

WEST:Go west

NORTH:Go north

EAST:Go east

SOUTH:Go south

注意:若要在枚举中定义字段和方法,必须在枚举对象的分号之后,java强制规定枚举对象必须放在枚举的最开始处。

另外,枚举的构造方法必须是private的,因为只允许在枚举内部定义枚举对象时使用,不允许在枚举类之后使用枚举的构造方法。

2.switch分支语句中使用枚举:

Java的switch分支语句中,switch的条件只能是整数数值类型,在JDK5以后枚举之后,由于枚举对象的顺序也是整数数值,因此switch也支持枚举,例子如下:

enum Signal{GREEN, YELLOW, RED}
public class TrafficLight{
	Signal color = Signal.RED;
	public void change(){
		switch(color){
	case RED:
		color = Signal.GREEN;
		break;
	case GREEN:
		color = Signal.YELLOW;
		break;
	case YELLOW:
		color = Signal.RED;
		break;
}
}
public String toString(){
	return “The traffic light is ” + color;
}
public static void main(String[] args){
	TrafficLight t = new TrafficLight();
	for(int i=0; i<5; i++){
		System.out.println(t);
		t.change();
}
}
}

输出结果:

The traffic light is RED

The traffic light is GREEN

The traffic light is YELLOW

The traffic light is RED

The traffic light is GREEN

3.枚举Set:

EnumSet枚举Set是JDK5中引入的与枚举类型一起使用的专用Set实现,EnumSet中所有键都必须来自单个枚举类型,枚举Set在内部表示为位向量。位向量表示形式的EnumSet非常紧凑高效,空间性和时间性非常好,同时由于枚举对象含义清楚,因此EnumSet可以替换传统技艺int的位标志(在程序开发中,很多时候需要使用一串数字序列的位标志,每位代表不同的含义,例如网络协议等)。例子如下:

//星期枚举
public enum Week{
	MON, TUE, WEN, THU, FRI, SAT, SUN
}

import java.util.*;
//EnumSet例子
public class EnumSets{
	public static void main(String[] args){
		//EnumSet的noneOf方法创建指定枚举类型的空EnumSet
		EnumSet<Week> weeks = EnumSet.noneOf(Week.class);
		weeks.add(MON);
		System.out.println(weeks);
		//EnumSet的of方法创建包含指定枚举类型元素的EnumSet
		weeks.addAll(EnumSet.of(TUE, WEN, THU));
		System.out.println(weeks);
		// EnumSet的allOf方法创建包含指定枚举类型所有元素的EnumSet
		weeks = EnumSet.allOf(Week.class);
		System.out.println(weeks);
		weeks.removeAll(EnumSet.of(FRI, SAT, SUN));
System.out.println(weeks);
// EnumSet的rang方法创建包含指定枚举类型两个元素之间的EnumSet
weeks.removeAll(EnumSet.rang(MON, WEN));
System.out.println(weeks);
// EnumSet的complementOf方法创建指定EnumSet所不包含元素的EnumSet
weeks.removeAll(EnumSet.complementOf(weeks));
System.out.println(weeks);
}
}

输出结果:

[MON]

[MON, TUE, WEN, THU]

[MON, TUE, WEN, THU, FRI, SAT, SUN]

[MON, TUE, WEN, THU]

[THU]

[MON, TUE, WEN, FRI, SAT, SUN]

注意:EnumSet的元素排列是依据Enum的定义顺序排列的,所有的基本操作都在固定时间内执行,速度比HashSet可能更快。

4.枚举Map:

EnumMap是与枚举类型一起使用的专用Map实现,枚举Map中所有的键都必须来自单个枚举类型,枚举Map在内部表示为数组。和EnumSet类似,EnumMap键的顺序也是和Enum的定义顺序一致,EnumMap的所有操作也都在固定时间内执行,它的速度可能比HashMap更快。

下面的例子使用EnumMap演示command interface的设计模式:
public enum Directions{
	EAST, NORTH, WEST, SOUTH
} 
interface Command{
	public void action();
}
public class EnumMaps{
	Public static void main(String[] args){
		EnumMap<Directions, Command> em = 
new EnumMap<Directions, Command>(Directions.class);
		em.put(EAST, new Command(){
	public void action(){
	System.out.println(“Go east”);
}	
});
 		em.put(NORTH, new Command(){
	public void action(){
	System.out.println(“Go north”);
}	
});
		em.put(WEST, new Command(){
	public void action(){
	System.out.println(“Go west”);
}	
});
		for(Map.Entry<Directions, Command> e : em.entrySet()){
			System.out.println(e.getKey() + “: ” + e.getValue().action());
}
try{
	em.get(SOUTH).action();
}catch(Exception e){
	System.out.println(e);
}
}
}

输出结果:

EAST: Go east

NORTH: Go north

WEST: Go west

java.lang.NullPointerException

从最后的空指针我们可以看出,EnumMap在创建时将Enum所有元素全部放进了key中,但是如果没有使用put显式将key和value关联的话,对应的value是null。

5.枚举特定方法:

在枚举中可以定义一个抽象的公共方法,然后各个枚举实例提供具体实现,实现一种类似匿名内部类的多态方式,例子如下:

import java.util.*;
import java.text.*;

public enum ConstantSpecificMethod{
	DATE_TIME{
	String getInfo(){
		return DateFormat.getDateInstance().format(new Date());
}
},
CLASS_PATH{
	String getInfo(){
		return System.getenv(“CLASSPATH”);
}
},
VERSION{
	String getInfo(){
		return System.getProperty(“java.version”);
}
};
//抽象方法
abstract String getInfo();
public static void main(String[] args){
	for(ConstantSpecificMethod csm : values()){
		System.out.println(csm.getInfo());
}
}
}

通过这种多态方式,同样方便高效实现Commandinterface设计模式。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值