Java Enum教程
Java枚举是表示常量值列表的特殊数据类型。
它是一种特殊类型的Java类。
它可以包含常量,方法和构造函数等。
假设我们获得三种类型的问题,需要不同的SLA来解决它。
通常它们是1级,2级和3级严重程度。
因此,它将在枚举中表示如下。
Public enum Severity (Level_1, Level_2, Level_3 )
这里
Serverity level= Severity. Level_1;
级变量是Serverity的类型,它是枚举类型的。
我们只能为其分配3个值(Level_1,Level_2和Level_3)。
如果我们分配任何其他值,则会为我们提供编译时错误。
在Java中为类型安全,并且有自己的名称空间
现在,我们必须想知道为什么我们不能在此处使用类,为什么需要特殊的数据类型名为ENUM。
让我们在示例的帮助下了解它:创建枚举作为severityenum.java
package org.igi.theitroad.corejava; public enum SeverityEnum { LEVEL_1, LEVEL_2, LEVEL_3; }
创建类作为severityclass.java
package org.igi.theitroad.corejava; public class SeverityClass { public static final String LEVEL_1="LEVEL_1"; public static final String LEVEL_2="LEVEL_2"; public static final String LEVEL_3="LEVEL_3"; }
创建问题.java。
它将在枚举和课堂上使用。
package org.igi.theitroad.corejava; public class Issue { String issueName; public Issue(String issueName) { super(); this.issueName = issueName; } public String getIssueName() { return issueName; } public void setIssueName(String issueName) { this.issueName = issueName; } public void resolveIssueEnum(SeverityEnum level) { System.out.println("Resolving "+issueName+ " of "+level.name()); } public void resolveIssueClass(String level) { System.out.println("Resolving "+issueName+ " of "+level); } }
创建enummain.java。
package org.igi.theitroad.corejava; public class EnumMain { public static void main(String args[]) { Issue a=new Issue("Server is down"); Issue b=new Issue("UI is not formatted properly"); System.out.println("Resolving issues:"); System.out.println("*"); a.resolveIssueClass(SeverityClass.LEVEL_2); //You are able to pass "LEVEL_5" also here, but LEVEL_5 is not defined as Severity at all //So this is considered to be invalid value, but you still can pass it if you use class b.resolveIssueClass("LEVEL_5"); //b.resolveIssueEnum("LEVEL_5"); //Compilation error //You can pass only fixed values with this which is our requirement here //So enum ensures type safety a.resolveIssueEnum(SeverityEnum.LEVEL_2); } }
运行上面的程序时,我们将获取以下输出:
Resolving issues: * Resolving Server is down of LEVEL_2 Resolving UI is not formatted properly of LEVEL_5 Resolving Server is down of LEVEL_2
它是类型安全的主要原因。
我们将无法使用枚举将任何其他值放入枚举,但如果我们使用类而不是枚举,可能会更容易出错,因为我们可以为其分配无效值。
让我们了解更多关于枚举。
package org.igi.theitroad.corejava; public class Issue { String issueName; public Issue(String issueName) { super(); this.issueName = issueName; } public String getIssueName() { return issueName; } public void setIssueName(String issueName) { this.issueName = issueName; } public static void main(String[] args) { Severity level=Severity.LEVEL_2; System.out.println(level.name()); } }
我们可以看到使用调试点的枚举结构。
将调试点放在第21行,并右键单击"项目 - >调试" - > Java应用程序。
程序将在第21行停止执行,然后右键单击级别,然后选择Watch.You将能够看到如下结构。
所以它有许多方法,其中两个是:name():它返回枚举常量。
对于上述枚举级别,其值为Level_2.
序号():它将我们返回枚举声明中的位置。
程序员通常不使用此方法,它主要用于基于枚举的数据结构,例如enumset。
构造函数:受保护的枚举(字符串名称,int序数)这只是eNUM中默认情况下的构造函数。
这不能被计划调用。
当我们声明枚举时,这在内部调用。
我根据他们的性质总结了枚举的重要观点。
构造函数:
- 枚举可以具有构造函数,并且可以过载。
- 枚举构造函数永远无法直接调用,在初始化枚举时会隐式调用它。
- 我们还可以为枚举常量提供值,但我们需要为此创建成员变量和构造函数
方法:
- 我们可以在枚举中声明方法。
- 我们还可以在枚举中声明抽象方法,同时声明常量,我们需要覆盖它。
宣言 :
- 我们无法使用新操作创建Enum的实例,因为它不支持公共构造函数,并且在枚举中需要固定值也是有意义的。如果允许新的运算符,则可以添加更多值。
//compilation error Serverity level=new Severity();
- 枚举常量隐含静态和最终。创建后无法更改其值。
- 我们不能将任何其他类扩展到枚举,因为枚举隐式扩展枚举类,Java不允许多重继承。
- 枚举可以在类的内部或者外部定义,但无法以方法定义。
- 枚举声明外部程序不能被声明为静态,抽象,私有,受保护或者最终。
- 枚举可以实现一个接口。
- 在枚举结束时声明的半冒号是可选的。
比较和swtich结构
- 我们可以使用"=="运算符进行枚举的值。
- 我们也可以在swtich结构中使用枚举。
例子:
创建名为severity.java的枚举类
package org.igi.theitroad.corejava; public enum Severity { LEVEL_1(1) { @Override public String getDescription() { return "SLA: 2 hours"; } }, LEVEL_2(2) { @Override public String getDescription() { return "SLA: 8 hours"; } }, LEVEL_3(3) { @Override public String getDescription() { return "SLA: 1 day"; } }; int level; Severity(int level) { this.level=level; } public int getLevel() { return level; } public abstract String getDescription(); }
创建Wisture.java,用于枚举类。
package org.igi.theitroad.corejava; public class Issue { String issueName; Severity issueLevel; public Issue(String issueName,Severity level) { super(); this.issueName = issueName; this.issueLevel=level; } public String getIssueName() { return issueName; } public void setIssueName(String issueName) { this.issueName = issueName; } public Severity getIssueLevel() { return issueLevel; } public void setIssueLevel(Severity level) { this.issueLevel = level; } public void resolveIssueUsingSwitch() { switch(issueLevel) { case LEVEL_1: System.out.println("Resolving level 1 issue"); break; case LEVEL_2: System.out.println("Resolving level 2 issue"); break; case LEVEL_3: System.out.println("Resolving level 3 issue"); break; } } public void resolveIssueUsingIfElse() { if(issueLevel==Severity.LEVEL_1) { System.out.println("Resolving level 1 issue"); } else if(issueLevel==Severity.LEVEL_2) { System.out.println("Resolving level 2 issue"); } else if(issueLevel==Severity.LEVEL_3) { System.out.println("Resolving level 3 issue"); } } }
创建enummain.java以运行代码:
package org.igi.theitroad.corejava; public class EnumMain { public static void main(String args[]) { Issue a=new Issue("Server is down",Severity.LEVEL_1); Issue b=new Issue("UI is not formatted properly",Severity.LEVEL_3); System.out.println("*"); System.out.println("Resolving issues:"); //Using if else a.resolveIssueUsingIfElse(); //Using switch case b.resolveIssueUsingSwitch(); System.out.println("*"); System.out.println("valueOf method example"); //converting string to Enum using valueOf Method Severity level2=Enum.valueOf(Severity.class,"LEVEL_2"); System.out.println(level2.name()+" -"+level2.getDescription()); //values for getting all enum values System.out.println("*"); System.out.println("values method example"); for (Severity level:Severity.values()) { System.out.println(level.name()+" - "+level.getDescription()); } } }
运行上面的代码时,我们将获取以下输出:
* Resolving issues: Resolving level 1 issue Resolving level 3 issue * valueOf method example LEVEL_2 -SLA: 8 hours * values method example LEVEL_1 - SLA: 2 hours LEVEL_2 - SLA: 8 hours LEVEL_3 - SLA: 1 day