Enum 被引入 Java 1.5 作为一个新的类型,其字段由固定的常数组成,例如,我们可以创建方向,如 Java Enum 用固定的字段,如东、西、北和南。
《Java Enum》
In this tutorial, we will learn know how to create an Enum. We will also look into the benefits of using enums in java and features of enum types. We will also learn using Java Enum
valueOf
, enum values
, EnumSet
and EnumMap
with examples.
Java 一个例子
Java enum 关键字用于创建 enum 类型,让我们来看看 java enum 示例程序。
1package com.journaldev.enums;
2
3public enum ThreadStates {
4 START,
5 RUNNING,
6 WAITING,
7 DEAD;
8}
在上面的示例中,ThreadStates 是固定常数字段 START、RUNNING、WAITING 和 DEAD 的单元。
Java Enum vs 常态
现在让我们看看 java enum 如何比 Java 类中的正常常数字段更好. 让我们在 java 中创建一个类似的常数类。
1package com.journaldev.enums;
2
3public class ThreadStatesConstant {
4 public static final int START = 1;
5 public static final int WAITING = 2;
6 public static final int RUNNING = 3;
7 public static final int DEAD = 4;
8}
现在让我们看看 enum 和常数如何在 Java 程序中使用:
1/**
2* This method shows the benefit of using Enum over Constants
3*/
4private static void benefitsOfEnumOverConstants() {
5 //Enum values are fixed
6 simpleEnumExample(ThreadStates.START);
7 simpleEnumExample(ThreadStates.WAITING);
8 simpleEnumExample(ThreadStates.RUNNING);
9 simpleEnumExample(ThreadStates.DEAD);
10 simpleEnumExample(null);
11
12 simpleConstantsExample(1);
13 simpleConstantsExample(2);
14 simpleConstantsExample(3);
15 simpleConstantsExample(4);
16 //we can pass any int constant
17 simpleConstantsExample(5);
18}
19
20private static void simpleEnumExample(ThreadStates th) {
21 if(th == ThreadStates.START) System.out.println("Thread started");
22 else if (th == ThreadStates.WAITING) System.out.println("Thread is waiting");
23 else if (th == ThreadStates.RUNNING) System.out.println("Thread is running");
24 else System.out.println("Thread is dead");
25}
26
27private static void simpleConstantsExample(int i) {
28 if(i == ThreadStatesConstant.START) System.out.println("Thread started");
29 else if (i == ThreadStatesConstant.WAITING) System.out.println("Thread is waiting");
30 else if (i == ThreadStatesConstant.RUNNING) System.out.println("Thread is running");
31 else System.out.println("Thread is dead");
32}
如果我们看上面的例子,我们有两个风险使用常数,这些常数是由 enum 解决的。
我们可以将任何 int 常数传输到 simpleConstantsExample
方法,但我们只能将固定值传输到 simpleEnumExample,因此它提供了类型安全性.
2 我们可以更改在 ThreadStatesConstant
类中的 int 常数值,但上面的程序不会排除任何例外。
Java Enum 方法
现在让我们用一个例子来看看 java enum 的更多功能。
1package com.journaldev.enums;
2
3import java.io.Closeable;
4import java.io.IOException;
5
6/**
7 * This Enum example shows all the things we can do with Enum types
8 *
9 */
10public enum ThreadStatesEnum implements Closeable{
11 START(1){
12 @Override
13 public String toString(){
14 return "START implementation. Priority="+getPriority();
15 }
16
17 @Override
18 public String getDetail() {
19 return "START";
20 }
21 },
22 RUNNING(2){
23 @Override
24 public String getDetail() {
25 return "RUNNING";
26 }
27 },
28 WAITING(3){
29 @Override
30 public String getDetail() {
31 return "WAITING";
32 }
33 },
34 DEAD(4){
35 @Override
36 public String getDetail() {
37 return "DEAD";
38 }
39 };
40
41 private int priority;
42
43 public abstract String getDetail();
44 //Enum constructors should always be private.
45 private ThreadStatesEnum(int i){
46 priority = i;
47 }
48
49 //Enum can have methods
50 public int getPriority(){
51 return this.priority;
52 }
53
54 public void setPriority(int p){
55 this.priority = p;
56 }
57
58 //Enum can override functions
59 @Override
60 public String toString(){
61 return "Default ThreadStatesConstructors implementation. Priority="+getPriority();
62 }
63
64 @Override
65 public void close() throws IOException {
66 System.out.println("Close of Enum");
67 }
68}
Java 關鍵點
以下是Java中的Enums的一些重要点。
- 联合国 所有java enum都含蓄地延伸出 " java.lang " 。 延伸的 Enum 类 对象类并实现可串行和[可通 (/community/touristics/comparable-和相通-in-java-example)接口. 因此,我们不能在enum.
- 由于enum是一个关键词,我们不能用它来结束软件包名称,例如'com.journaldev.enum' 不是有效的软件包名称
3。 Enum可以执行介面. 与上述例子一样,它正在实施
可关闭的
接口。 (_) (英语). 4. Enum 构造器总是私有的. - 我们不能使用新的运算符创建 enum 实例 。
- 我们可以宣布java中的抽象方法enum,然后所有enum域必须执行抽象方法. 以上例子
GetDetail()
是抽象方法, 所有 enum 字段都已执行 。 7。 我们可以定义一个方法 在enum和enum字段也可以覆盖它们。 例如,`toString ()'方法在enum和enum field中被定义,START已经超过它. - Java enum 字段有命名空间,我们只能使用
Thread States
这样的类名。 START - Enums 可以在 [switch 语句] (/community/tourises/java-switch-case-string)中被使用,我们会在本教程的后半部分看到它在动作中. () )10 (英语). 我们可以在不中断任何现有功能的情况下扩展现有的enum. 例如,我们可以在 ThreadStates enum 中添加一个新的字段 NEW ,而不影响任何现有的功能. () )11 (英语). 由于enum字段是常数,java最佳做法是用块字母来写出并下划线来表示空格. 例如,东部、西部、东部_ DIRECTION等
- Enum常数是含蓄地静态和最终
- Enum常数是最终的,但它的可变性仍然可以被改变. 例如,我们可以使用`setPriority()'方法来改变enum常数的优先权。 我们将在下面的例子中看到它的用法。 (_) )14 (英语). 由于enum常数是最终的,我们可以安全地用"=="和等分()的方法来比较. 两者的结果相同。 ( (英语)
Java EnumSet、EnumMap、valueOf()
现在我们知道Enum的大多数功能,让我们看看Java Enum示例程序,然后我们将学习一些Enum的更多功能。
1package com.journaldev.enums;
2
3import java.io.IOException;
4import java.util.EnumMap;
5import java.util.EnumSet;
6import java.util.Set;
7
8public class JavaEnumExamples {
9
10 public static void main(String[] args) throws IOException {
11
12 usingEnumMethods();
13
14 usingEnumValueOf();
15
16 usingEnumValues();
17
18 usingEnumInSwitch(ThreadStatesEnum.START);
19 usingEnumInSwitch(ThreadStatesEnum.DEAD);
20
21 usingEnumMap();
22
23 usingEnumSet();
24
25 }
26
27 private static void usingEnumSet() {
28 EnumSet enumSet = EnumSet.allOf(ThreadStatesEnum.class);
29 for(ThreadStatesEnum tsenum : enumSet){
30 System.out.println("Using EnumSet, priority = "+tsenum.getPriority());
31 }
32 }
33
34 private static void usingEnumMap() {
35 EnumMap<ThreadStatesEnum, String> enumMap = new EnumMap<ThreadStatesEnum,String>(ThreadStatesEnum.class);
36 enumMap.put(ThreadStatesEnum.START, "Thread is started");
37 enumMap.put(ThreadStatesEnum.RUNNING, "Thread is running");
38 enumMap.put(ThreadStatesEnum.WAITING, "Thread is waiting");
39 enumMap.put(ThreadStatesEnum.DEAD, "Thread is dead");
40
41 Set keySet = enumMap.keySet();
42 for(ThreadStatesEnum key : keySet){
43 System.out.println("key="+key.toString()+":: value="+enumMap.get(key));
44 }
45
46 }
47
48 private static void usingEnumInSwitch(ThreadStatesEnum th) {
49 switch (th){
50 case START:
51 System.out.println("START thread");
52 break;
53 case WAITING:
54 System.out.println("WAITING thread");
55 break;
56 case RUNNING:
57 System.out.println("RUNNING thread");
58 break;
59 case DEAD:
60 System.out.println("DEAD thread");
61 }
62 }
63
64 private static void usingEnumValues() {
65 ThreadStatesEnum[] thArray = ThreadStatesEnum.values();
66
67 for(ThreadStatesEnum th : thArray){
68 System.out.println(th.toString() + "::priority="+th.getPriority());
69 }
70 }
71
72 private static void usingEnumValueOf() {
73 ThreadStatesEnum th = Enum.valueOf(ThreadStatesEnum.class, "START");
74 System.out.println("th priority="+th.getPriority());
75 }
76
77 private static void usingEnumMethods() throws IOException {
78 ThreadStatesEnum thc = ThreadStatesEnum.DEAD;
79 System.out.println("priority is:"+thc.getPriority());
80
81 thc = ThreadStatesEnum.DEAD;
82 System.out.println("Using overriden method."+thc.toString());
83
84 thc = ThreadStatesEnum.START;
85 System.out.println("Using overriden method."+thc.toString());
86 thc.setPriority(10);
87 System.out.println("Enum Constant variable changed priority value="+thc.getPriority());
88 thc.close();
89 }
90
91}
在解释enum的其他重要功能之前,让我们看看上面的程序的输出。
1priority is:4
2Using overriden method.Default ThreadStatesConstructors implementation. Priority=4
3Using overriden method.START implementation. Priority=1
4Enum Constant variable changed priority value=10
5Close of Enum
6th priority=10
7START implementation. Priority=10::priority=10
8Default ThreadStatesConstructors implementation. Priority=2::priority=2
9Default ThreadStatesConstructors implementation. Priority=3::priority=3
10Default ThreadStatesConstructors implementation. Priority=4::priority=4
11START thread
12DEAD thread
13key=START:: value=Thread is started
14key=RUNNING:: value=Thread is running
15key=WAITING:: value=Thread is waiting
16key=DEAD:: value=Thread is dead
17Using EnumSet, priority = 10
18Using EnumSet, priority = 2
19Using EnumSet, priority = 3
20Using EnumSet, priority = 4
重要点
- 联合国 `使用Enum Methods ()' 方法显示如何创建一个enum 对象以及我们如何使用它的方法。 它还显示使用'setPriority(int (i))'方法来改变enum.
- 使用 EnumValueOf() 显示使用'java. util. Enum ' valueOf(enumType, name)' 我们可以通过它从 String 创建一个 enum 对象 。 它扔出
Illegal Argument Exception',如果指定的enum类型与指定的名称没有常数,或者指定的类对象不代表一个enum类型. 如果任何参数无效,它也会抛出
NullPointer Exception` 。 使用EnumValues () 方法显示使用** values () ** 方法,该方法将返回一个包含该enum的所有值的数组,按其声明顺序排列。 注意这种方法由java编译器为每个enum自动生成. 您不会在 java. util 中找到执行值 。 Enum 类。 (_) (英语). 4.
使用 EnumInSwitch () ` 方法显示开关中如何使用enum常数- 使用 EnumMap()方法显示使用java.util。 EnumMap,在Java 1.5 Collections Framework中被引入. `enumMap'是地图的应用,与enum类型的密钥相通。 一个enum映射中的所有密钥都必须出自一个单一的enum类型,在映射创建时明确或含蓄地被指定. 我们不能用空键来表示 EnumMap 和 EnumMap 不同步 。
使用 EnumSet ()' 方法显示使用 **java. util 。 EnumSet **,是设置用于有enum类型的执行. enum set中的所有元素必须来自一个单一的enum类型,该类型在创建集时被明示地或暗示地指定. EnumSet不同步,不允许空出元素. 它还提供了一些有用的方法,如
coperOf(收集c)'、 of(E先,E.-休息)'和
complementOf(enumSets)'.
您可以从我们的 GitHub 存储库中查看所有示例。
参考: Oracle Doc