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 ...
随机推荐
- 【开发笔记】- Linux命令大全
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- app后端设计(php)
来源:http://blog.csdn.net/column/details/mobilebackend.html?page=1 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经 ...
- linux时间格式
date "+%Y-%m-%d %H:%M:%S" 2019-10-27 12:02:33
- iview表单数字验证
sort: [ {required: true, message: '请填写栏目排序', trigger: 'blur'}, {type: 'number', message: '请输入数字', tr ...
- Python学习日记(二十二) 初识面向对象
引子 假设我们要开发一个关于飞机大战的游戏,那么游戏的里面就会有两个角色,分别是属于玩家操控的战机和敌方的战机,并且两个战机都有不同的技能或攻击方式,现在我们用自己目前所学的去写出下面的这些代码: d ...
- yum [Errno 12] Timeout on
今天新安装一台CentOS,进行yum安装时出现以下问题提示 perl-5.16.3-294.el7_6.x86_64.r FAILED ...
- kubernetes-使用kubeadm部署kubernetes集群
k8s官网介绍 Kubernetes是一个可移植的,可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化.它拥有一个庞大且快速增长的生态系统.Kubernetes的服务,支持和工 ...
- [dev][nginx] 在阅读nginx代码之前都需要准备什么
前言 以前,我读过nginx的源码,甚至还改过.但是,现在回想起来几乎回想不起任何东西, 只记得到处都是回调和异步,我的vim+ctags索引起来十分吃力. 几乎没有任何收获,都是因为当时打开代码就看 ...
- Linux命令——dumpe2fs
参考:Linux磁盘管理——Ext2文件系统 简介 dumpe2fs用于查询 Ext 家族 superblock以及GDT(Group Descriptor Table,块组描述符表) 信息. 用法 ...
- Vim编译器的相关知识
Vim编译器相关知识 1.关于Vim编译器 在热门Linux操作系统中都会默认安装一款超好用的文本编辑器——名字叫“vim”,vim是vi编辑器的升级版. vim 具有程序编辑的能力,可以主动的以字体 ...