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
Java枚举类接口实战的更多相关文章
- Java枚举类在生产环境中的使用方式
前言 Java枚举在项目中使用非常普遍,许多人在做项目时,一定会遇到要维护某些业务场景状态的时候,往往会定义一个常量类,然后添加业务场景相关的状态常量.但实际上,生产环境的项目中业务状态的定义大部 ...
- 夯实Java基础系列14:深入理解Java枚举类
目录 初探枚举类 枚举类-语法 枚举类的具体使用 使用枚举类的注意事项 枚举类的实现原理 枚举类实战 实战一无参 实战二有一参 实战三有两参 枚举类总结 枚举 API 总结 参考文章 微信公众号 Ja ...
- java 枚举类小结 Enum
好久没有接触枚举类了,差不多都忘了,今天抽出个时间总结一下吧.说实话,枚举类确实能够给我们带来很大的方便. 说明:枚举类它约定了一个范围,可以理解成只可以生成固定的几个对象让外界去调用,故枚举类中的构 ...
- java枚举类
enum关键字用于定义枚举类,若枚举只有一个成员, 则可以作为一种单例模式的实现方式. 枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰. 枚举类的使用 priva ...
- 【JAVA】浅谈java枚举类
一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...
- Java枚举类enum
枚举类enum是JDK1.5引入的,之前都是用public static final int enum_value来代替枚举类的.枚举类enum是一种特殊的类,它默认继承了类java.lang.Enu ...
- Java枚举类使用
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...
- Java 枚举类详解
1. 枚举类定义 在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有4个对象,这种实例有限而且固定的类,在Java里被称为枚举类. 2. 早期实现枚举的方式 public static f ...
- Java基础15:深入剖析Java枚举类
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
随机推荐
- C语言开发中常用英文缩写
BIOS(Basic Input Output System): 基本输入输出系统 reference: https://baike.baidu.com/item/bios/91424?fr=alad ...
- sql server 获取某一字段分组数据的前十条记录
1.sql 语法 select m, n from ( select row_number () over (partition by m order by n desc) rn,--以m分组,分组内 ...
- django后台标题替换
在制作django后台的时候,默认的django admin界面标题为“django管理”,找了许多的资料都很麻烦,偶与好友一起探讨,找到了新的解决方法 在django的py文件中插入 from dj ...
- iptables-2基本语法结构
1.规则的概念先说说规则的概念,然后再通俗的解释它.规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理:那么我们来通俗的解释一下什么是iptable ...
- 解决远程连接数据库:Host is not allowed to connect to this MySQL server
远程连接数据时,报以下提示: Host 'web1' is not allowed to connect to this MySQL server 原因是数据库服务不允许远程登录,没有授权导致,解决方 ...
- WebSocket转载
目录 概述 WebSocket 客户端 WebSocket 服务端 WebSocket 代理 FAQ 完整示例 资料 概述 WebSocket 是什么? WebSocket 是一种网络 ...
- Android笔记(六十三) android中的动画——逐帧动画( frame-by-frame animation)
就好像演电影一样,播放实现准备好的图片,来实现动画效果. 逐帧动画需要用到AnimationDrawable类,该类主要用于创建一个逐帧动画,然后我们把这个动画设置为view的背景即可. androi ...
- springboot2.1.3+spring-session2.1.4分库处理
使用spring session框架来统一管理session,该框架支持jdbc.redis存储,使用非常简单,可以去官网查看文档一步步接入即可,官网文档如下:https://docs.spring. ...
- c# IComparable与IComparer接口
- 【Linux】缺少service命令的解决办法
执行保存防火墙策略报错:提示没有找到service的文件遇到这个问题后,执行下面的命令,需要安装一个包initscripts rpm -qa | grep initscripts yum list | ...