您的位置:首页 > 编程语言 > Java开发

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

2015-06-03 16:24 447 查看
1.在枚举中添加方法:

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

[java] view
plaincopy

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也支持枚举,例子如下:

[java] view
plaincopy

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的位标志(在程序开发中,很多时候需要使用一串数字序列的位标志,每位代表不同的含义,例如网络协议等)。例子如下:

[java] view
plaincopy

//星期枚举

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的设计模式:

[java] view
plaincopy

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.枚举特定方法:

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

[java] view
plaincopy

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设计模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: