# 深入研究枚举类型

## 基础知识

##### 清单 1. 枚举类型的例子
```public class Loop {
enum Size {
Small,
Medium,
Large
}
public static void main(String args[]) {
for (Size s : Size.values()) {
helper(s);
}
}
private static void helper(Size s) {
System.out.println("Size value: " + s);
}
}```

## 构造函数、方法和变量

##### 清单 2. 映射的构造函数调用
```  new Enum<Size>("Small", 0);
new Enum<Size>("Medium", 1);
new Enum<Size>("Large", 2);```

##### 清单 3. 定制构造函数的例子
```public class Sample {
enum Size {
Small(0.8),
Medium(1.0),
Large(1.2);
double pricingFactor;
Size(double p) {
pricingFactor = p;
}
}
public static void main(String args[]) {
Size s = Size.Large;
double d = s.pricingFactor;
System.out.println(s + " Size has pricing factor of " + d);
}
}```

##### 清单 4. 方法的例子
```public class Sample2 {
enum Size {
Small(0.8),
Medium(1.0),
Large(1.2);
private double pricingFactor;
Size(double p) {
pricingFactor = p;
}
public double getPricingFactor() {
return pricingFactor;
}
}
public static void main(String args[]) {
Size s = Size.Large;
double d = s.getPricingFactor();
System.out.println(s + " Size has pricing factor of " + d);
}
}```

`Large Size has pricing factor of 1.2`

## 预定义的方法

• `public int compareTo(E e)`
• `public boolean equals(Object o)`
• `public final Class<E> getDeclaringClass()`
• `public int hashCode()`
• `public String name()`
• `public int ordinal()`
• `public String toString()`
• `public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)`

`getDeclaringClass()``valueOf()` 方法需要稍多一些解释。`getDeclaringClass()` 方法类似于 `Object``getClass()` 方法，但它没必要返回相同的类。根据这个方法的 Javadoc 的说明：

## 特定于常量的类主体

##### 清单 5. 特定于常量的主体
```public class Sample3 {
enum Size {
Small {
public double getPricingFactor() {
return 0.8;
}
},
Medium,
Large,
ExtraLarge {
public double getPricingFactor() {
return 1.2;
}
},
ExtraExtraLarge {
public double getPricingFactor() {
return 1.2;
}
};
public double getPricingFactor() {
return 1.0;
}
}
public static void main(String args[]) {
for (Size s : Size.values()) {
double d = s.getPricingFactor();
System.out.println(s + " Size has pricing factor of " + d);
}
}
}```

## EnumMap 和 EnumSet

`java.util` 程序包中包含两个类：`EnumMap``EnumSet`，这两个类有助于使处理枚举类型变得更容易一些。`EnumMap` 类提供了 `java.util.Map` 接口的一个特殊实现，该接口中的键（key）是一个枚举类型。`EnumSet` 类提供了 `java.util.Set` 接口的实现，该接口保存了某种枚举类型的值的集合。

##### 清单 6. EnumMap 的例子
```import java.util.*;
public class EnumMapSample {
enum Size {
Small,
Medium,
Large;
}
public static void main(String args[]) {
Map<Size, Double> map = new EnumMap<Size, Double>(Size.class);
map.put(Size.Small, 0.8);
map.put(Size.Medium, 1.0);
map.put(Size.Large, 1.2);
for (Map.Entry<Size, Double> entry : map.entrySet()) {
helper(entry);
}
}
private static void helper(Map.Entry<Size, Double> entry) {
System.out.println("Map entry: " + entry);
}
}```

• `public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)`
• `public static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s)`
• `public static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c)`
• `public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType)`
• `public static <E extends Enum<E>> EnumSet<E> of(E e)`
• `public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest)`
• `public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2)`
• `public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3)`
• `public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4)`
• `public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)`
• `public static <E extends Enum<E>> EnumSet<E> range(E from, E to)`

## 结束语

#### 评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology
ArticleID=74134
ArticleTitle=驯服 Tiger: 深入研究枚举类型
publish-date=04192005