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 ...
随机推荐
- 转 js一个简单实用的弹出层
关闭 点击查看 >> <html> <head> <title>新文件标题</title> <script type=" ...
- undefined reference to cv::imread(cv::String const&, int)
.build_release/lib/libcaffe-nv.so: undefined reference to cv::imread(cv::String const&, int)' .b ...
- Java开发环境搭建(一)
一.JDK与JRE JDK:Java Development Kit,Java开发工具包,是给开发人员使用的,其中包含了Java的开发工具,如java.javac.jar等命令,同时也包含了JRE. ...
- idea 控制台允许输入
打开idea配置文件添加 -Deditable.java.test.console=true
- 【iOS】去除字符串首尾空格或某字符
在iOS的实际开发中,常会出现需要去除空格的情况,总结有三种情况: 去除字符串首尾连续字符(如空格): 去除字符串首部连续字符(如空格): 去除字符串尾部连续字符(如空格): 去除字符串首尾连续字符( ...
- Duplicate zip entry [com/umeng/analytics/a.class==analytics-5.5.3.jar:com/umeng/analytics/AnalyticsConfig.class
项目中需要用到Umeng统计分析,按照官网上的步骤做混淆后,在签名时报下面的错误: Error:java.io.IOException:Can't read [/.gradle/caches/modu ...
- 17.centos7基础学习与积累-003-命令练习01
1.从头开始积累centos7系统运用 大牛博客:https://blog.51cto.com/yangrong/p5 linux命令的学习: 创建目录:mkdir mkdir /data mkdir ...
- C++ --- 编码习惯小区别
定义一个变量,最好养成C代码的习惯 C代码: 用到的变量X,要在最开始定义:先定义,用的时候在初始化: [例如] int x; //先定义 ..... ..... ; //再初始化 C++代码: 用到 ...
- C++中得sort函数的比较函数(第三个参数)为什么要声明为static
sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错. 因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法再sort中 ...
- Appium环境搭建(Mac)
为什么选择Mac做自动化测试? 既可以做iOS端的测试也可以进行Android端测试 Mac运行效率相对于Win要高很多,可以真正发挥appium的功能 环境依赖 Node.js Appium App ...