今天在学习的过程中遇到了枚举这个知识点。之前一直都知道这个“名字”,只是对其中的含义和相关用法都并不了解。所以决定粗浅学习一下。搜索了一下,这方面的资料不少。其中主要参考的博文有两篇,附上链接:链接1链接2

枚举类型介绍

    1. 定义:枚举类型(enum type)是指由一组固定的常量组成合法的类型。Java中由关键字enum来定义一个枚举类型。例子如下:
      public enum Color{
          RED,GREEN,BLUE,YELLOW
      }
  • 2.枚举类型被用来将一组类似的值包含到一种类型当中。而这种枚举类型的名称则会被定成独一无二的类型描述符,在这一点上和常量的定义相似。不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围。举个例子:在我们平时使用switch的时候,switch的值只能是简单类型如int、byte、short、char。而有了枚举类型之后,就可以直接使用对象。代码例子如下:

// 定义一周七天的枚举类型 
 public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun } 

 // 读取当天的信息
 WeekDayEnum today = readToday(); 

 // 根据日期来选择进行活动
 switch(today) { 
  Mon: do something; break; 
  Tue: do something; break; 
  Wed: do something; break; 
  Thu: do something; break; 
  Fri: do something; break; 
  Sat: play sports game; break; 
  Sun: have a rest; break; 
 }

对于这些枚举的日期,JVM 都会在运行期构造成出一个简单的对象实例一一对应。这些对象都有唯一的 identity,类似整形数值一样,switch 语句就根据此来进行执行跳转。

为什么引入Enum类型

在Java语言没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。通常利用public final static方法定义相关代码。例子如下:
“`java
Public static class RainbowColor {

// 红橙黄绿青蓝紫七种颜色的常量定义
    public static final int RED = 0; 
    public static final int ORANGE = 1; 
    public static final int YELLOW = 2; 
    public static final int GREEN = 3; 
    public static final int CYAN = 4; 
    public static final int BLUE = 5; 
    public static final int PURPLE = 6; 
 }
```

使用的时候,我们可以在程序中直接引用这些常量。但是这种模式有什么问题呢?大家都用了那么久了,为什么还要引入枚举类型(enum type)(从Java1.5开始引入枚举类型)呢?要从以下几个方面说起。
- 安全性(类型不安全)
由于颜色常量的对应值是整数形,所以程序执行过程中很有可能给颜色变量传入一个任意的整数值,导致出现错误。

  • 一致性差
    因为整形枚举属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增加新的枚举值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。
  • 可读性差
    使用枚举的大多数场合,我都需要方便得到枚举类型的字符串表达式。如果将int枚举常量打印出来,我们所见到的就是一组数字,这是没什么太大的用处。我们可能会想到使用String常量代替int常量。虽然它为这些常量提供了可打印的字符串,但是它会导致性能问题,因为它依赖于字符串的比较操作,所以这种模式也是我们不期望的。

    因此,从类型安全性程序可读性两方面考虑,int和String枚举模式的缺点就显露出来了。

    用法大总结

    *那么什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数、一年四季等。或者是在我们编译前就知道其包含的所有值得集合。Java 1.5的枚举类型能满足绝大多数程序员的要求的,它的简明,易用的特点是很突出的。

    1. 用法一:常量
      java
      public enum Color {
      RED, GREEN, BLANK, YELLOW
      }

    2. 用法二:switch

      ```java
      enum Signal {  
      GREEN, YELLOW, RED

      }
      public class TrafficLight {
      Signal color = Signal.RED;
      public void change() {
      switch (color) {
      case RED:
      color = Signal.GREEN;
      break;
      case YELLOW:
      color = Signal.RED;
      break;
      case GREEN:
      color = Signal.YELLOW;
      break;
      }
      }
      }
      “`

    3. 用法三:向枚举中添加新方法

      ```java
      public enum Color {  
          RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
          // 成员变量  
          private String name;  
          private int index;  
          // 构造方法  
          private Color(String name, int index) {  
              this.name = name;  
              this.index = index;  
          }  
          // 普通方法  
          public static String getName(int index) {  
              for (Color c : Color.values()) {  
                  if (c.getIndex() == index) {  
                      return c.name;  
                  }  
              }  
              return null;  
          }  
          // get set 方法  
          public String getName() {  
              return name;  
          }  
          public void setName(String name) {  
              this.name = name;  
          }  
          public int getIndex() {  
              return index;  
          }  
          public void setIndex(int index) {  
              this.index = index;  
          }  
      }  
      ```
    4. 用法四:覆盖枚举的方法
      java
      public enum Color {
      RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
      // 成员变量
      private String name;
      private int index;
      // 构造方法
      private Color(String name, int index) {
      this.name = name;
      this.index = index;
      }
      //覆盖方法
      @Override
      public String toString() {
      return this.index+"_"+this.name;
      }
      }
    5. 用法五:实现接口
      java
      public interface Behaviour {
      void print();
      String getInfo();
      }
      public enum Color implements Behaviour{
      RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
      // 成员变量
      private String name;
      private int index;
      // 构造方法
      private Color(String name, int index) {
      this.name = name;
      this.index = index;
      }
      //接口方法
      @Override
      public String getInfo() {
      return this.name;
      }
      //接口方法
      @Override
      public void print() {
      System.out.println(this.index+":"+this.name);
      }
      }
    6. 用法六:使用接口组织枚举
      public interface Food {  
          enum Coffee implements Food{  
              BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
          }  
          enum Dessert implements Food{  
              FRUIT, CAKE, GELATO  
          }  
      }

    全文结束,希望对大家有所帮助。

无觅关联推荐,快速提升流量