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, paramInt, paramString1, null);
  }
  
  public String getGrade(String paramString) {
    return paramString + " Fail";
  }
}

Reference

https://www.jianshu.com/p/b108c44c2d56

https://www.cnblogs.com/alter888/p/9163612.html

原文地址:https://www.cnblogs.com/east7/p/11827871.html