Java Enum教程

时间:2020-02-23 14:35:00  来源:igfitidea点击:

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