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

