当前位置 主页 > 网站技术 > 代码类 >

    Java枚举类接口实例原理解析

    栏目:代码类 时间:2020-01-16 18:07

    这篇文章主要介绍了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";
     }
    }