1. 程式人生 > 程式設計 >Java列舉類介面例項原理解析

Java列舉類介面例項原理解析

這篇文章主要介紹了Java列舉類介面例項原理解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

列舉類可以實現一個或多個介面。與普通類實現介面完全一樣,列舉類實現介面時,需要實現該介面所包含的方法。

如果需要每個列舉值在呼叫同一個方法時呈現不同的行為,則可以讓每個列舉值在{...}匿名塊中實現自己的業務邏輯。

public interface IGradeHandler {
  String getGrade(String studentName);
}
public enum GradeHandlerEnum implements IGradeHandler {
  //five grade levels A B C D E
  A("90~100") {
    @Override
    public String getGrade(String studentName) {
      return studentName + " Outstanding";
    }
  },E("0~59") {
    @Override
    public String getGrade(String studentName) {
      return studentName + " Fail";
    }
  };
  private String score;

  GradeHandlerEnum(String score) {
    this.score = score;
  }

  public String getScore() {
    return this.score;
  }

  public static void main(String[] args) {
    GradeHandlerEnum a = GradeHandlerEnum.A;
    GradeHandlerEnum e = GradeHandlerEnum.valueOf("E");
    System.out.println( a.getGrade("Lucy"));
    System.out.println( e.getGrade("Tom"));
  }
}

為了方便測試,示例只定義了A和E兩個等級,執行結果如下:

Lucy Outstanding
Tom Fail

反編譯列舉類

在《Java列舉抽象方法例項解析》中介紹了列舉型別的簡單使用,現在有必要來了解一下它的基本實現原理。實際上在使用關鍵字enum建立列舉類並編譯後,編譯器會生成一些相關的類,這些類繼承了Java API中的java.lang.Enum類,也就是說通過關鍵字enum建立的列舉類在編譯後事實上也是一個類型別而且該類繼承自java.lang.Enum類。

IGradeHandler.class
GradeHandlerEnum.class
GradeHandlerEnum$1.class
GradeHandlerEnum$2.class

使用javac編譯GradeHandlerEnum.java檔案後,生成四個class檔案,其中,GradeHandlerEnum.class是列舉型別,這也就驗證前面所說的使用關鍵字enum定義列舉類並編譯後,編譯器會自動幫助我們生成一個與列舉相關的類。使用jd-gui反編譯後的主要class檔案如下:

import java.io.PrintStream;

public enum GradeHandlerEnum implements IGradeHandler {
// 編譯後生成兩個class檔案GradeHandlerEnum$1和GradeHandlerEnum$2
 A("90~100"),E("0~59");
 
 private String score;
 //私有建構函式
 private GradeHandlerEnum(String paramString) {
  this.score = paramString;
 }
 
 public String getScore() {
  return this.score;
 }
 
 public static void main(String[] paramArrayOfString) {
//例項化列舉例項,變數名由系統生成
  GradeHandlerEnum localGradeHandlerEnum1 = A;
  GradeHandlerEnum localGradeHandlerEnum2 = valueOf("E");
  System.out.println(localGradeHandlerEnum1.getGrade("Lucy"));
  System.out.println(localGradeHandlerEnum2.getGrade("Tom"));
 }
}
//列舉值A對應的列舉類
enum GradeHandlerEnum$1{
 GradeHandlerEnum$1(String paramString1) {
  super(paramString,paramInt,paramString1,null);
 }
 
 public String getGrade(String paramString) {
  return paramString + " Outstanding";
 }
}
//列舉值B對應的列舉類
enum GradeHandlerEnum$2{
 GradeHandlerEnum$2(String paramString1) {
  super(paramString,null);
 }
 
 public String getGrade(String paramString) {
  return paramString + " Fail";
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。