目录
Java编程思想(一)第1~4章:概述
Java编程思想(二)第5章:初始化和清理
Java编程思想(三)第6章:访问权限
Java编程思想(四)第7章:复用类
Java编程思想(五)第8章:多态
Java编程思想(六)第9章:接口
Java编程思想(七)第10章:内部类
Java编程思想(八)第11章:持有对象
Java编程思想(九)第12章:异常
Java编程思想(十)第13章:字符串
Java编程思想(十一)第14章:类型信息
Java编程思想(十二)第15章:泛型
Java编程思想(十三)第16章:数组
Java编程思想(十四)第17章:深入研究容器
Java编程思想(十五)第18章:Java I/O系统
Java编程思想(十六)第19章:枚举
Java编程思想(十七)第20章:注解
Java编程思想(十八)第21章:并发
第十九章、枚举类型
目录
1. 基本enum特性
2. switch语句中的enum
3.values()的神秘之处
5. 实现,而非继承
6. 随机选取
7. 使用接口组织枚举
8. 使用EnumSet替代位标志(BitSet)
9. 使用EnumMap
10 常量相关的方法
11 多路分发
概述:
Enum类提供的功能如下:
1.1 将静态导入用于enum
import static enumerated.Spiciness*;
1.2 向enum中添加新方法
public enum OzWitch {
// Instances must be defined first, before methods:
WEST("Miss Gulch"),
NORTH("Glinda"),
EAST("Wicked"),
SOUTH("Good");//必须在enum实例序列的最后添加一个分号。
private String description;
// Constructor must be package or private access:
private OzWitch(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
@Override
public String toString() {}
public static void main(String[] args) {
for (OzWitch witch : OzWitch.values()) {
print(witch + ": " + witch.getDescription());
}
}
}
enum Signal {
GREEN, YELLOW, RED,
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
case GREEN:
case YELLOW:
}
}
}
enum类都自动继承自Enum类(编译器实现),我们可以查看Enum中并没有values()方法。利用反射机制查看究竟:
enum Search {HITHER, YON}
public class UpcastEnum {
public static void main(String[] args) {
Search[] vals = Search.values();
Enum e = Search.HITHER; // Upcast
// e.values(); // No values() in Enum
for (Enum en : e.getClass().getEnumConstants()) {
System.out.println(en);
}
}
}
getEnumConstants() 获取所有Enum对象的实例
enum CartoonCharacter implements Generator {
SLAPPY, SPANKY, PUNCHY, SILLY, BOUNCY, NUTTY, BOB;
private Random rand = new Random(47);
@Override
public CartoonCharacter next() {
return values()[rand.nextInt(values().length)];
}
}
public interface Food {
enum Appetizer implements Food {
SALAD, SOUP, SPRING_ROLLS;
}
enum MainCourse implements Food {
LASAGNE, BURRITO, PAD_THAI,
LENTILS, HUMMOUS, VINDALOO;
}
enum Dessert implements Food {
TIRAMISU, GELATO, BLACK_FOREST_CAKE,
FRUIT, CREME_CARAMEL;
}
enum Coffee implements Food {
BLACK_COFFEE, DECAF_COFFEE, ESPRESSO,
LATTE, CAPPUCCINO, TEA, HERB_TEA;
}
}
public class TypeOfFood {
public static void main(String[] args) {
Food food = Appetizer.SALAD;
food = MainCourse.LASAGNE;
food = Dessert.GELATO;
food = Coffee.CAPPUCCINO;
}
}
EnumSet 包含的使用方法:
研究EnumSet文档,会发现of()方法被重载了很多次,不但为可变数量参数进行了重载,而且为接受2至5个显式的参数的情况都进行了重载。这也从侧面表现了EnumSet对性能的关注。
9.1 命令模式(GoF23之一)的具体实现
interface Command {
void action();
}
enum AlarmPoints{
STAIR,LOBBY,OFFICE,BATHROOM,UTILITY,KITCHEN
}
public class EnumMaps {
public static void main(String[] args) {
EnumMap em =
new EnumMap(AlarmPoints.class);
em.put(KITCHEN, new Command() {
public void action() {
print("Kitchen fire!");
}
});
em.put(BATHROOM, new Command() {
public void action() {
print("Bathroom alert!");
}
});
for (Map.Entry e : em.entrySet()) {
printnb(e.getKey() + ": ");
e.getValue().action();
}
try { // If there's no value for a particular key:
em.get(UTILITY).action();
} catch (Exception e) {
print(e);
}
}
}
9.2 EnumMap 包含的使用方法:
public enum ConstantSpecificMethod {
DATE_TIME {
String getInfo() {
return DateFormat.getDateInstance().format(new Date());
}
},
CLASSPATH {
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());
}
}
}
10.1 使用enum的职责链
10.2 使用enum的状态机
多路分发的几种实现方式: