枚举类可以实现一个或多个接口。与普通类实现接口完全一样,枚举类实现接口时,需要实现该接口所包含的方法。

如果需要每个枚举值在调用同一个方法时呈现不同的行为,则可以让每个枚举值在{...}匿名块中实现自己的业务逻辑。

  1. public interface IGradeHandler {
  2. String getGrade(String studentName);
  3. }
  1. public enum GradeHandlerEnum implements IGradeHandler {
  2. //five grade levels A B C D E
  3. A("90~100") {
  4. @Override
  5. public String getGrade(String studentName) {
  6. return studentName + " Outstanding";
  7. }
  8. },
  9. E("0~59") {
  10. @Override
  11. public String getGrade(String studentName) {
  12. return studentName + " Fail";
  13. }
  14. };
  15. private String score;
  16.  
  17. GradeHandlerEnum(String score) {
  18. this.score = score;
  19. }
  20.  
  21. public String getScore() {
  22. return this.score;
  23. }
  24.  
  25. public static void main(String[] args) {
  26. GradeHandlerEnum a = GradeHandlerEnum.A;
  27. GradeHandlerEnum e = GradeHandlerEnum.valueOf("E");
  28. System.out.println( a.getGrade("Lucy"));
  29. System.out.println( e.getGrade("Tom"));
  30. }
  31. }

为了方便测试,示例只定义了A和E两个等级,执行结果如下:

  1. Lucy Outstanding
  2. Tom Fail

反编译枚举类

在《Java枚举抽象方法实战》中介绍了枚举类型的简单使用,现在有必要来了解一下它的基本实现原理。实际上在使用关键字enum创建枚举类并编译后,编译器会生成一些相关的类,这些类继承了Java API中的java.lang.Enum类,也就是说通过关键字enum创建的枚举类在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类。

  1. IGradeHandler.class
  2. GradeHandlerEnum.class
  3. GradeHandlerEnum$1.class
  4. GradeHandlerEnum$2.class

使用javac编译GradeHandlerEnum.java文件后,生成四个class文件,其中,GradeHandlerEnum.class是枚举类型,这也就验证前面所说的使用关键字enum定义枚举类并编译后,编译器会自动帮助我们生成一个与枚举相关的类。使用jd-gui反编译后的主要class文件如下:

  1. import java.io.PrintStream;
  2.  
  3. public enum GradeHandlerEnum implements IGradeHandler {
  4. // 编译后生成两个class文件GradeHandlerEnum$1和GradeHandlerEnum$2
  5. A("90~100"), E("0~59");
  6.  
  7. private String score;
  8. //私有构造函数
  9. private GradeHandlerEnum(String paramString) {
  10. this.score = paramString;
  11. }
  12.  
  13. public String getScore() {
  14. return this.score;
  15. }
  16.  
  17. public static void main(String[] paramArrayOfString) {
  18. //实例化枚举实例,变量名由系统生成
  19. GradeHandlerEnum localGradeHandlerEnum1 = A;
  20. GradeHandlerEnum localGradeHandlerEnum2 = valueOf("E");
  21. System.out.println(localGradeHandlerEnum1.getGrade("Lucy"));
  22. System.out.println(localGradeHandlerEnum2.getGrade("Tom"));
  23. }
  24. }
  25. //枚举值A对应的枚举类
  26. enum GradeHandlerEnum$1{
  27. GradeHandlerEnum$1(String paramString1) {
  28. super(paramString, paramInt, paramString1, null);
  29. }
  30.  
  31. public String getGrade(String paramString) {
  32. return paramString + " Outstanding";
  33. }
  34. }
  35. //枚举值B对应的枚举类
  36. enum GradeHandlerEnum$2{
  37. GradeHandlerEnum$2(String paramString1) {
  38. super(paramString, paramInt, paramString1, null);
  39. }
  40.  
  41. public String getGrade(String paramString) {
  42. return paramString + " Fail";
  43. }
  44. }

Reference

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

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

Java枚举类接口实战的更多相关文章

  1. Java枚举类在生产环境中的使用方式

    前言   Java枚举在项目中使用非常普遍,许多人在做项目时,一定会遇到要维护某些业务场景状态的时候,往往会定义一个常量类,然后添加业务场景相关的状态常量.但实际上,生产环境的项目中业务状态的定义大部 ...

  2. 夯实Java基础系列14:深入理解Java枚举类

    目录 初探枚举类 枚举类-语法 枚举类的具体使用 使用枚举类的注意事项 枚举类的实现原理 枚举类实战 实战一无参 实战二有一参 实战三有两参 枚举类总结 枚举 API 总结 参考文章 微信公众号 Ja ...

  3. java 枚举类小结 Enum

    好久没有接触枚举类了,差不多都忘了,今天抽出个时间总结一下吧.说实话,枚举类确实能够给我们带来很大的方便. 说明:枚举类它约定了一个范围,可以理解成只可以生成固定的几个对象让外界去调用,故枚举类中的构 ...

  4. java枚举类

    enum关键字用于定义枚举类,若枚举只有一个成员, 则可以作为一种单例模式的实现方式.   枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰. 枚举类的使用 priva ...

  5. 【JAVA】浅谈java枚举类

    一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...

  6. Java枚举类enum

    枚举类enum是JDK1.5引入的,之前都是用public static final int enum_value来代替枚举类的.枚举类enum是一种特殊的类,它默认继承了类java.lang.Enu ...

  7. Java枚举类使用

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

  8. Java 枚举类详解

    1. 枚举类定义 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象,这种实例有限而且固定的类,在Java里被称为枚举类. 2. 早期实现枚举的方式 public static f ...

  9. Java基础15:深入剖析Java枚举类

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

随机推荐

  1. C语言开发中常用英文缩写

    BIOS(Basic Input Output System): 基本输入输出系统 reference: https://baike.baidu.com/item/bios/91424?fr=alad ...

  2. sql server 获取某一字段分组数据的前十条记录

    1.sql 语法 select m, n from ( select row_number () over (partition by m order by n desc) rn,--以m分组,分组内 ...

  3. django后台标题替换

    在制作django后台的时候,默认的django admin界面标题为“django管理”,找了许多的资料都很麻烦,偶与好友一起探讨,找到了新的解决方法 在django的py文件中插入 from dj ...

  4. iptables-2基本语法结构

    1.规则的概念先说说规则的概念,然后再通俗的解释它.规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理:那么我们来通俗的解释一下什么是iptable ...

  5. 解决远程连接数据库:Host is not allowed to connect to this MySQL server

    远程连接数据时,报以下提示: Host 'web1' is not allowed to connect to this MySQL server 原因是数据库服务不允许远程登录,没有授权导致,解决方 ...

  6. WebSocket转载

    目录   概述  WebSocket 客户端  WebSocket 服务端  WebSocket 代理  FAQ  完整示例  资料 概述 WebSocket 是什么? WebSocket 是一种网络 ...

  7. Android笔记(六十三) android中的动画——逐帧动画( frame-by-frame animation)

    就好像演电影一样,播放实现准备好的图片,来实现动画效果. 逐帧动画需要用到AnimationDrawable类,该类主要用于创建一个逐帧动画,然后我们把这个动画设置为view的背景即可. androi ...

  8. springboot2.1.3+spring-session2.1.4分库处理

    使用spring session框架来统一管理session,该框架支持jdbc.redis存储,使用非常简单,可以去官网查看文档一步步接入即可,官网文档如下:https://docs.spring. ...

  9. c# IComparable与IComparer接口

  10. 【Linux】缺少service命令的解决办法

    执行保存防火墙策略报错:提示没有找到service的文件遇到这个问题后,执行下面的命令,需要安装一个包initscripts rpm -qa | grep initscripts yum list | ...