Skip to content

Commit 8e65ec9

Browse files
authored
Update 05_Enumerated_Types.md
1 parent 3843542 commit 8e65ec9

File tree

1 file changed

+44
-141
lines changed

1 file changed

+44
-141
lines changed

ch03/05_Enumerated_Types.md

Lines changed: 44 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
1-
# 枚举类型
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](04_Comparator.md)
3+
4+
### 枚举类型
25

36
`Java 5` 包含对枚举类型的支持。 这是一个简单的例子:
47

58
```java
69
enum Season { WINTER, SPRING, SUMMER, FALL }
710
```
811

9-
每个枚举类型声明都可以以程式化的方式扩展为相应的类。相应的类被设计为每个枚举常量都有一个实例,绑定到一个合适的静态最终变量。 例如,上面的枚举声明扩展为一个名为 `Season` 的类。 这个类存在四个实例,绑定到四个静态最终变量,名称分别为 `WINTER`,`SPRING`,`SUMMER`,和 `FALL`.
12+
每个枚举类型声明都可以以程式化的方式扩展为相应的类。相应的类被设计为每个枚举常量都有一个实例,绑定到一个合适的静态最终变量。 例如,上面的枚举声明扩展
13+
为一个名为 `Season` 的类。 这个类存在四个实例,绑定到四个静态最终变量,名称分别为 `WINTER`,`SPRING`,`SUMMER`,和 `FALL`
1014

1115
与枚举类型对应的每个类都是 `java.lang.Enum` 的子类。 它在 `Java` 文档中的定义是这样开始的:
1216

1317
```java
1418
class Enum<E extends Enum<E>>
1519
```
1620

17-
你可能会发现这种可怕的一见钟情 - 我们当然都这么做! 但不要恐慌。实际上,我们已经看到了类似的东西。 令人担忧的短语 `E extends Enum <E>` 与我们在 `max` 定义中遇到的 `T extends Comparable <T>` 很像(见 `3.2` 节),我们将看到它们出于相关原因。
21+
你可能会发现这种可怕的一见钟情 - 我们当然都这么做! 但不要恐慌。实际上,我们已经看到了类似的东西。 令人担忧的短语 `E extends Enum <E>` 与我们在
22+
`max` 定义中遇到的 `T extends Comparable <T>` 很像(见 `3.2` 节),我们将看到它们出于相关原因。
1823

19-
为了理解发生了什么,我们需要看看代码。 例 `3-4` 显示了基类 `Enum`,例 `3-5` 显示了与上面的枚举类型声明对应的类 `Season`。(`Enum` 的代码遵循 `Java` 库中的源代码,但我们简化了几个要点。)
24+
为了理解发生了什么,我们需要看看代码。 例 `3-4` 显示了基类 `Enum`,例 `3-5` 显示了与上面的枚举类型声明对应的类 `Season`。(`Enum` 的代码遵循
25+
`Java` 库中的源代码,但我们简化了几个要点。)
2026

2127
这是 `Enum` 类声明的第一行:
2228

@@ -30,7 +36,7 @@
3036
class Season extends Enum<Season>
3137
```
3238

33-
例3-3。比较
39+
例 `3-3`。比较
3440

3541
```java
3642
class Comparators {
@@ -50,25 +56,25 @@ class Season extends Enum<Season>
5056
public static <T extends Comparable<? super T>> T min(Collection<? extends T> coll){
5157
return max(coll, Comparators.<T>reverseOrder());
5258
}
53-
public static <T extends Comparable<? super T>> Comparator<T> naturalOrder(){
54-
return new Comparator<T>() {
55-
public int compare(T o1, T o2) { return o1.compareTo(o2); }
56-
};
57-
}
58-
public static <T> Comparator<T> reverseOrder(final Comparator<T> cmp){
59-
return new Comparator<T>() {
60-
public int compare(T o1, T o2) { return cmp.compare(o2,o1); }
61-
};
62-
}
63-
public static <T extends Comparable<? super T>> Comparator<T> reverseOrder(){
64-
return new Comparator<T>() {
65-
public int compare(T o1, T o2) { return o2.compareTo(o1); }
66-
};
67-
}
59+
public static <T extends Comparable<? super T>> Comparator<T> naturalOrder(){
60+
return new Comparator<T>() {
61+
public int compare(T o1, T o2) { return o1.compareTo(o2); }
62+
};
63+
}
64+
public static <T> Comparator<T> reverseOrder(final Comparator<T> cmp){
65+
return new Comparator<T>() {
66+
public int compare(T o1, T o2) { return cmp.compare(o2,o1); }
67+
};
68+
}
69+
public static <T extends Comparable<? super T>> Comparator<T> reverseOrder(){
70+
return new Comparator<T>() {
71+
public int compare(T o1, T o2) { return o2.compareTo(o1); }
72+
};
73+
}
6874
}
6975
```
7076

71-
例3-4。 枚举类型的基类
77+
`3-4`。 枚举类型的基类
7278

7379
```java
7480
public abstract class Enum<E extends Enum<E>> implements Comparable<E> {
@@ -86,7 +92,7 @@ class Season extends Enum<Season>
8692
}
8793
```
8894

89-
例3-5。 对应于枚举类型的类
95+
`3-5`。 对应于枚举类型的类
9096

9197
```java
9298
// corresponds to
@@ -144,128 +150,25 @@ class Season extends Enum<Season>
144150
class Season extends Enum
145151
```
146152

147-
这更简单,但它太简单了。 有了这个定义,`Season` 将实现 `Comparable <Enum>` 而不是 `Comparable<Season>`,这意味着我们可以将 `Season` 类型的值与任何枚举类型的值进行比较,这肯定不是我们想要的!
148-
149-
一般来说,当你想精确地确定类型时,像 `T` 这样的模式经常出现 `Comparable <T>` 和 `E extends Enum <E>`。当我们查看战略和主题观察者设计模式时,我们会看到更多的例子,参见第 `9.4` 节和第 `9.5` 节。
150-
151-
定义的其余部分是 `Joshua Bloch` 在 `Effective Java(Addison-Wesley)` 中描述的类型安全模式的一个简单应用,后者又是 `Gamma`,`Helm`,`Johnson` 和 `Vlissides` 在设计模式中描述的单例模式的一个实例(`Addison-Wesley`出版社)。
152-
153-
基类 `Enum` 定义了两个字段,一个字符串名称和一个整数序号,它们由枚举类型的每个实例拥有;这些字段是最终的,因为一旦它们被初始化,它们的值永远不会改变。该类的构造函数是受保护的,以确保它仅在此类的子类中使用。每个枚举类都使构造函数保持私有,以确保它仅用于创建枚举常量。例如,`Season` 类有一个私人构造函数,它被调用四次以初始化最终变量 `WINTER`,`SPRING`,`SUMMER` 和 `FALL`。
154-
155-
基类为名称和序号字段定义访问器方法。该 `toString` 方法返回名称,并且 `compareTo` 方法仅返回两个枚举值的序数的差异。(与第 `3.1` 节中的 `Integer` 定义不同,这是安全的,因为不存在溢出的可能性)。因此,常量与它们的序号具有相同的顺序 - 例如,`WINTER` 在 `SUMMER` 之前。
156-
157-
最后,每个类中有两个对应于枚举类型的静态方法。 `values` 方法返回该类型所有常量的数组。它返回内部数组的一个(浅)克隆。克隆对于确保客户端无法更改内部阵列至关重要。请注意,调用 `clone` 方法时不需要强制转换,因为克隆数组现在可以利用协变返回类型(请参见第 `3.8` 节)。 `valueOf` 方法接受一个字符串并返回相应的常量,通过搜索内部数组找到。如果字符串没有命名枚举值,它将返回 `IllegalArgumentException`。
158-
159-
160-
161-
162-
163-
164-
165-
166-
167-
168-
169-
170-
171-
172-
173-
174-
175-
176-
177-
178-
179-
180-
181-
182-
183-
184-
185-
186-
187-
188-
189-
190-
191-
192-
193-
194-
195-
196-
197-
198-
199-
200-
201-
202-
203-
204-
205-
206-
207-
208-
209-
210-
211-
212-
213-
214-
215-
216-
217-
218-
219-
220-
221-
222-
223-
224-
225-
226-
227-
228-
229-
230-
231-
232-
233-
234-
235-
236-
237-
238-
239-
240-
241-
242-
243-
244-
245-
246-
247-
248-
249-
250-
251-
252-
253-
254-
255-
256-
257-
258-
259-
260-
261-
262-
263-
264-
265-
153+
这更简单,但它太简单了。 有了这个定义,`Season` 将实现 `Comparable <Enum>` 而不是 `Comparable<Season>`,这意味着我们可以将 `Season` 类型的值与
154+
任何枚举类型的值进行比较,这肯定不是我们想要的!
266155

156+
一般来说,当你想精确地确定类型时,像 `T` 这样的模式经常出现 `Comparable <T>` 和 `E extends Enum <E>`。当我们查看战略和主题观察者设计模式时,我们
157+
会看到更多的例子,参见第 `9.4` 节和第 `9.5` 节。
267158

159+
定义的其余部分是 `Joshua Bloch` 在 `Effective Java(Addison-Wesley)` 中描述的类型安全模式的一个简单应用,后者又是 `Gamma`,`Helm`,`Johnson` 和
160+
`Vlissides` 在设计模式中描述的单例模式的一个实例(`Addison-Wesley`出版社)。
268161

162+
基类 `Enum` 定义了两个字段,一个字符串名称和一个整数序号,它们由枚举类型的每个实例拥有;这些字段是最终的,因为一旦它们被初始化,它们的值永远不会改变。
163+
该类的构造函数是受保护的,以确保它仅在此类的子类中使用。每个枚举类都使构造函数保持私有,以确保它仅用于创建枚举常量。例如,`Season` 类有一个私人构造函
164+
数,它被调用四次以初始化最终变量 `WINTER`,`SPRING`,`SUMMER` 和 `FALL`。
269165

166+
基类为名称和序号字段定义访问器方法。该 `toString` 方法返回名称,并且 `compareTo` 方法仅返回两个枚举值的序数的差异。(与第 `3.1` 节中的 `Integer`
167+
定义不同,这是安全的,因为不存在溢出的可能性)。因此,常量与它们的序号具有相同的顺序 - 例如,`WINTER` 在 `SUMMER` 之前。
270168

169+
最后,每个类中有两个对应于枚举类型的静态方法。 `values` 方法返回该类型所有常量的数组。它返回内部数组的一个(浅)克隆。克隆对于确保客户端无法更改内部
170+
阵列至关重要。请注意,调用 `clone` 方法时不需要强制转换,因为克隆数组现在可以利用协变返回类型(请参见第 `3.8` 节)。 `valueOf` 方法接受一个字符串并
171+
返回相应的常量,通过搜索内部数组找到。如果字符串没有命名枚举值,它将返回 `IllegalArgumentException`。
271172

173+
《《《 [下一节](06_Multiple Bounds.md) <br/>
174+
《《《 [返回首页](../README.md)

0 commit comments

Comments
 (0)