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
3036class 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