1
- # 枚举类型
1
+ 《《《 [ 返回首页] ( ../README.md ) <br />
2
+ 《《《 [ 上一节] ( 04_Comparator.md )
3
+
4
+ ### 枚举类型
2
5
3
6
` Java 5 ` 包含对枚举类型的支持。 这是一个简单的例子:
4
7
5
8
``` java
6
9
enum Season { WINTER , SPRING , SUMMER , FALL }
7
10
```
8
11
9
- 每个枚举类型声明都可以以程式化的方式扩展为相应的类。相应的类被设计为每个枚举常量都有一个实例,绑定到一个合适的静态最终变量。 例如,上面的枚举声明扩展为一个名为 ` Season ` 的类。 这个类存在四个实例,绑定到四个静态最终变量,名称分别为 ` WINTER ` ,` SPRING ` ,` SUMMER ` ,和 ` FALL ` .
12
+ 每个枚举类型声明都可以以程式化的方式扩展为相应的类。相应的类被设计为每个枚举常量都有一个实例,绑定到一个合适的静态最终变量。 例如,上面的枚举声明扩展
13
+ 为一个名为 ` Season ` 的类。 这个类存在四个实例,绑定到四个静态最终变量,名称分别为 ` WINTER ` ,` SPRING ` ,` SUMMER ` ,和 ` FALL ` 。
10
14
11
15
与枚举类型对应的每个类都是 ` java.lang.Enum ` 的子类。 它在 ` Java ` 文档中的定义是这样开始的:
12
16
13
17
``` java
14
18
class Enum <E extends Enum<E > >
15
19
```
16
20
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` 节),我们将看到它们出于相关原因。
18
23
19
- 为了理解发生了什么,我们需要看看代码。 例 `3-4` 显示了基类 `Enum `,例 `3-5` 显示了与上面的枚举类型声明对应的类 `Season `。(`Enum ` 的代码遵循 `Java ` 库中的源代码,但我们简化了几个要点。)
24
+ 为了理解发生了什么,我们需要看看代码。 例 `3-4` 显示了基类 `Enum `,例 `3-5` 显示了与上面的枚举类型声明对应的类 `Season `。(`Enum ` 的代码遵循
25
+ `Java ` 库中的源代码,但我们简化了几个要点。)
20
26
21
27
这是 `Enum ` 类声明的第一行:
22
28
30
36
class Season extends Enum<Season >
31
37
```
32
38
33
- 例3-3 。比较
39
+ 例 `3-3` 。比较
34
40
35
41
```java
36
42
class Comparators {
@@ -50,25 +56,25 @@ class Season extends Enum<Season>
50
56
public static <T extends Comparable<? super T > > T min (Collection<? extends T > coll ){
51
57
return max(coll, Comparators . < T > reverseOrder());
52
58
}
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
+ }
68
74
}
69
75
```
70
76
71
- 例3-4 。 枚举类型的基类
77
+ 例 ` 3-4 ` 。 枚举类型的基类
72
78
73
79
``` java
74
80
public abstract class Enum <E extends Enum<E > > implements Comparable<E > {
@@ -86,7 +92,7 @@ class Season extends Enum<Season>
86
92
}
87
93
```
88
94
89
- 例3-5 。 对应于枚举类型的类
95
+ 例 ` 3-5 ` 。 对应于枚举类型的类
90
96
91
97
``` java
92
98
// corresponds to
@@ -144,128 +150,25 @@ class Season extends Enum<Season>
144
150
class Season extends Enum
145
151
```
146
152
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
+ 任何枚举类型的值进行比较,这肯定不是我们想要的!
266
155
156
+ 一般来说,当你想精确地确定类型时,像 `T ` 这样的模式经常出现 `Comparable <T >` 和 `E extends Enum <E >`。当我们查看战略和主题观察者设计模式时,我们
157
+ 会看到更多的例子,参见第 `9.4` 节和第 `9.5` 节。
267
158
159
+ 定义的其余部分是 `Joshua Bloch ` 在 `Effective Java (Addison -Wesley )` 中描述的类型安全模式的一个简单应用,后者又是 `Gamma `,`Helm `,`Johnson ` 和
160
+ `Vlissides ` 在设计模式中描述的单例模式的一个实例(`Addison -Wesley `出版社)。
268
161
162
+ 基类 `Enum ` 定义了两个字段,一个字符串名称和一个整数序号,它们由枚举类型的每个实例拥有;这些字段是最终的,因为一旦它们被初始化,它们的值永远不会改变。
163
+ 该类的构造函数是受保护的,以确保它仅在此类的子类中使用。每个枚举类都使构造函数保持私有,以确保它仅用于创建枚举常量。例如,`Season ` 类有一个私人构造函
164
+ 数,它被调用四次以初始化最终变量 `WINTER `,`SPRING `,`SUMMER ` 和 `FALL `。
269
165
166
+ 基类为名称和序号字段定义访问器方法。该 `toString` 方法返回名称,并且 `compareTo` 方法仅返回两个枚举值的序数的差异。(与第 `3.1` 节中的 `Integer `
167
+ 定义不同,这是安全的,因为不存在溢出的可能性)。因此,常量与它们的序号具有相同的顺序 - 例如,`WINTER ` 在 `SUMMER ` 之前。
270
168
169
+ 最后,每个类中有两个对应于枚举类型的静态方法。 `values` 方法返回该类型所有常量的数组。它返回内部数组的一个(浅)克隆。克隆对于确保客户端无法更改内部
170
+ 阵列至关重要。请注意,调用 `clone` 方法时不需要强制转换,因为克隆数组现在可以利用协变返回类型(请参见第 `3.8` 节)。 `valueOf` 方法接受一个字符串并
171
+ 返回相应的常量,通过搜索内部数组找到。如果字符串没有命名枚举值,它将返回 `IllegalArgumentException `。
271
172
173
+ 《《《 [下一节](06_Multiple Bounds .md) <br/>
174
+ 《《《 [返回首页](../README .md)
0 commit comments