1
1
---
2
- title : 新来个技术总监,彻底把 Java 枚举(enum)讲清楚了
2
+ title : Java枚举:小小enum,优雅而干净
3
3
shortTitle : Java枚举(enum)
4
4
category :
5
5
- Java核心
@@ -9,9 +9,11 @@ description: Java程序员进阶之路,小白的零基础Java教程,从入
9
9
head :
10
10
- - meta
11
11
- name : keywords
12
- content : Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java入门,教程,java,枚举,enum
12
+ content : Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路, Java入门,教程,java,枚举,enum,java 枚举,java enum
13
13
---
14
14
15
+ # 5.23 Java枚举
16
+
15
17
“今天我们来学习枚举吧,三妹!”我说,“同学让你去她家玩了两天,感觉怎么样呀?”
16
18
17
19
“心情放松了不少。”三妹说,“可以开始学 Java 了,二哥。”
@@ -127,19 +129,19 @@ if(player.getType().equals(Player.PlayerType.BASKETBALL)){};
127
129
128
130
``` java
129
131
switch (playerType) {
130
- case TENNIS :
131
- return " 网球运动员费德勒" ;
132
- case FOOTBALL :
133
- return " 足球运动员C罗" ;
134
- case BASKETBALL :
135
- return " 篮球运动员詹姆斯" ;
136
- case UNKNOWN :
137
- throw new IllegalArgumentException (" 未知" );
138
- default :
139
- throw new IllegalArgumentException (
140
- " 运动员类型: " + playerType);
132
+ case TENNIS :
133
+ return " 网球运动员费德勒" ;
134
+ case FOOTBALL :
135
+ return " 足球运动员C罗" ;
136
+ case BASKETBALL :
137
+ return " 篮球运动员詹姆斯" ;
138
+ case UNKNOWN :
139
+ throw new IllegalArgumentException (" 未知" );
140
+ default :
141
+ throw new IllegalArgumentException (
142
+ " 运动员类型: " + playerType);
141
143
142
- }
144
+ }
143
145
```
144
146
145
147
“如果枚举中需要包含更多信息的话,可以为其添加一些字段,比如下面示例中的 name,此时需要为枚举添加一个带参的构造方法,这样就可以在定义枚举时添加对应的名称了。”我继续说。
@@ -166,11 +168,10 @@ public enum PlayerType {
166
168
167
169
“来吧,我准备好了。”
168
170
169
- “EnumSet 是一个专门针对枚举类型的 Set 接口(后面会讲)的实现类,它是处理枚举类型数据的一把利器,非常高效。”我说,“从名字上就可以看得出,EnumSet 不仅和 Set 有关系,和枚举也有关系。”
171
+ “EnumSet 是一个专门针对枚举类型的 [ Set 接口] ( https://tobebetterjavaer.com/collection/gailan.html ) (后面会讲)的实现类,它是处理枚举类型数据的一把利器,非常高效。”我说,“从名字上就可以看得出,EnumSet 不仅和 Set 有关系,和枚举也有关系。”
170
172
171
173
“因为 EnumSet 是一个抽象类,所以创建 EnumSet 时不能使用 new 关键字。不过,EnumSet 提供了很多有用的静态工厂方法。”
172
174
173
-
174
175
![ ] ( https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/enum/enum-02.png )
175
176
176
177
“来看下面这个例子,我们使用 ` noneOf() ` 静态工厂方法创建了一个空的 PlayerType 类型的 EnumSet;使用 ` allOf() ` 静态工厂方法创建了一个包含所有 PlayerType 类型的 EnumSet。”
@@ -216,7 +217,7 @@ EnumMap<PlayerType, String> enumMap = new EnumMap<>(PlayerType.class);
216
217
217
218
![ ] ( https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/enum/enum-04.png )
218
219
219
- 和 HashMap(后面会讲)的使用方法大致相同,来看下面的例子。
220
+ 和 [ HashMap] ( https://tobebetterjavaer.com/collection/hashmap.html ) (后面会讲)的使用方法大致相同,来看下面的例子。
220
221
221
222
``` java
222
223
EnumMap<PlayerType , String > enumMap = new EnumMap<> (PlayerType . class);
@@ -276,7 +277,7 @@ public class Singleton {
276
277
}
277
278
```
278
279
279
- “要用到 volatile、 synchronized 关键字等等,但枚举的出现,让代码量减少到极致。”
280
+ “要用到 [ volatile] ( https://tobebetterjavaer.com/thread/volatile.html ) 、 [ synchronized] ( https://tobebetterjavaer.com/thread/synchronized-1.html ) 关键字等等,但枚举的出现,让代码量减少到极致。”
280
281
281
282
``` java
282
283
public enum EasySingleton {
@@ -286,7 +287,7 @@ public enum EasySingleton{
286
287
287
288
“就这?”三妹睁大了眼睛。
288
289
289
- “对啊,枚举默认实现了 Serializable 接口,因此 Java 虚拟机可以保证该类为单例,这与传统的实现方式不大相同。传统方式中,我们必须确保单例在反序列化期间不能创建任何新实例。”我说。
290
+ “对啊,枚举默认实现了 [ Serializable 接口] ( https://tobebetterjavaer.com/io/Serializbale.html ) ,因此 Java 虚拟机可以保证该类为单例,这与传统的实现方式不大相同。传统方式中,我们必须确保单例在反序列化期间不能创建任何新实例。”我说。
290
291
291
292
“好了,关于枚举就讲这么多吧,三妹,你把这些代码都手敲一遍吧!”
292
293
0 commit comments