zoukankan      html  css  js  c++  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, 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

  • 相关阅读:
    ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第二篇:第一个页面
    HTML5网页录音和压缩,边猜边做..(附源码)
    策划编写一个新的Helper类
    正由另一进程使用,因此该进程无法访问此文件。
    第三方组件引用另一个第三方组件的悲剧
    数据库连接池的计数器设计
    让Ajax更简单
    更新Literacy
    多说
    利用C#自带组件强壮程序日志
  • 原文地址:https://www.cnblogs.com/east7/p/11827871.html
Copyright © 2011-2022 走看看