Java枚举(用Java普通类模拟枚举的实现原理及JDK枚举API使用示例)
枚举的特点:
◆类型安全(Type Safety)
◆紧凑有效的枚举数值定义(Compact, Efficient Declaration of Enumerated Values)
◆无缝的和程序其它部分的交互操作(Seamless integration with other language features)
◆运行的高效率(Runtime efficiency)
详情请看:http://www.51cto.com/specbook/11/32877.htm
1、使用Java普通类模拟枚举的实现原理
import java.util.HashMap;
import java.util.Map;/*** 模拟星期中的表示的天,每个星期天都表示一个对象* 1、类中的每一个枚举成员都是该类的一个实例对象* 2、构造函数私有化* 3、提供操作枚举成员的抽象方法和静态方法* @author 杨信**/
public abstract class WeekDate {/*** 星期一*/public static final WeekDate MON = new WeekDate("MON",0) { //匿名子类@Overridepublic WeekDate nextDay() {return TUES;}@Overridepublic WeekDate preDay() {return SUN;}@Overridepublic String toString() {return "WeekDate.MON";}}; /*** 星期二*/public static final WeekDate TUES = new WeekDate("TUES",1) {@Overridepublic WeekDate nextDay() {return WEDNES;}@Overridepublic WeekDate preDay() {return MON;}@Overridepublic String toString() {return "WeekDate.TUES";}};/*** 星期三*/public static final WeekDate WEDNES = new WeekDate("WEDNES",2) {@Overridepublic WeekDate nextDay() {return THURS;}@Overridepublic WeekDate preDay() {return TUES;}@Overridepublic String toString() {return "WeekDate.WEDNES";}};/*** 星期四*/public static final WeekDate THURS = new WeekDate("THURS",3) {@Overridepublic WeekDate nextDay() {return FRI;}@Overridepublic WeekDate preDay() {return WEDNES;}@Overridepublic String toString() {return "WeekDate.THURS";}};/*** 星期五*/public static final WeekDate FRI = new WeekDate("FRI",4){@Overridepublic WeekDate nextDay() {return SATUR;}@Overridepublic WeekDate preDay() {return THURS;}@Overridepublic String toString() {return "WeekDate.FRI";}};/*** 星期六*/public static final WeekDate SATUR = new WeekDate("SATUR",5){@Overridepublic WeekDate nextDay() {return SUN;}@Overridepublic WeekDate preDay() {return FRI;}@Overridepublic String toString() {return "WeekDate.SATUR";}};/*** 星期日*/public static final WeekDate SUN = new WeekDate("SUN",6){@Overridepublic WeekDate nextDay() {return MON;}@Overridepublic WeekDate preDay() {return SATUR;}@Overridepublic String toString() {return "WeekDate.SUN";}};private static Map<String, WeekDate> valueMap = new HashMap<String, WeekDate>();/*** 枚举名称*/private final String name;/*** 枚举成员的顺序*/private final int ordinal;private WeekDate(String name,int ordinal) {this.name = name;this.ordinal = ordinal;}/*** 保存枚举成员*/private static WeekDate[] values = {MON,TUES,WEDNES,THURS,FRI,SATUR,SUN};//初始化static {valueMap.put("MON", values[0]);valueMap.put("TUES", values[1]);valueMap.put("WEDNES", values[2]);valueMap.put("THURS", values[3]);valueMap.put("FRI", values[4]);valueMap.put("SATUR", values[5]);valueMap.put("SUN", values[6]);}/*** 下一天* @return*/public abstract WeekDate nextDay();/*** 前一天* @return*/public abstract WeekDate preDay();/*** 枚举中的所有成员* @return*/public static WeekDate[] values() {return values;}/*** 将一个字符串转换成一个枚举成员对象* @param name 枚举名称* @return 枚举对象*/public static WeekDate valueOf(String name) {if (name.equalsIgnoreCase("MON")) {return MON;} else if (name.equalsIgnoreCase("TUES")) {return TUES;} else if (name.equalsIgnoreCase("WEDES")) {return WEDNES;} else if (name.equalsIgnoreCase("THURS")) {return THURS;} else if (name.equalsIgnoreCase("FRI")) {return FRI;} else if (name.equalsIgnoreCase("SATUR")) {return SATUR;} else if (name.equalsIgnoreCase("SUN")) {return SUN;} else {throw new IllegalArgumentException("找不到" + name + "枚举类型!");}}/*** 优化字符串转枚举对象* @param name 枚举名称* @return 枚举对象*/public static WeekDate valueOf_2(String name) {WeekDate value = valueMap.get(name.toUpperCase());if (value == null) {throw new IllegalArgumentException("找不到" + name + "枚举类型!");}return value;}public String getName() {return name;}public int getOrdinal() {return ordinal;}/*** 下一天* @return*//*public String nextDay() {if(this == MON) {return "TUES";} else if (this == TUES) {return "WEDNES";} else if (this == WEDNES) {return "THURS";} else if (this == THURS) {return "FRI";} else if (this == FRI) {return "SATUR";} else if (this == SATUR) {return "SUN";} else {return "MON";}}*//*** 前一天*//*public String preDay() {if (this == MON) {//....} else if (...)....}*/}
2、使用JDK5.0中提供的枚举特性改善普通类模拟枚举的功能
/*** 枚举的应用* 存储每周中的天份*/
public enum WeekDateEnum {MON {@Overridepublic WeekDateEnum nextDay() {return TUES;}@Overridepublic WeekDateEnum preDay() {return SUN;}}, TUES {@Overridepublic WeekDateEnum nextDay() {return WEDNES;}@Overridepublic WeekDateEnum preDay() {return MON;}}, WEDNES {@Overridepublic WeekDateEnum nextDay() {return THURS;}@Overridepublic WeekDateEnum preDay() {return TUES;}}, THURS {@Overridepublic WeekDateEnum nextDay() {return FRI;}@Overridepublic WeekDateEnum preDay() {return WEDNES;}}, FRI {@Overridepublic WeekDateEnum nextDay() {return SATUR;}@Overridepublic WeekDateEnum preDay() {return THURS;}}, SATUR {@Overridepublic WeekDateEnum nextDay() {return SATUR;}@Overridepublic WeekDateEnum preDay() {return FRI;}}, SUN {@Overridepublic WeekDateEnum nextDay() {return SATUR;}@Overridepublic WeekDateEnum preDay() {return MON;}};private WeekDateEnum() {}/*** 下一天* @return*/public abstract WeekDateEnum nextDay();/*** 前一天* @return*/public abstract WeekDateEnum preDay();/*** 枚举对象公共的toString方法,可以在case块中反馈自己想要返回的信息*/public String toString() {switch (this) {case MON:return "WeekDateEnum.MON";case TUES:return "WeekDateEnum.TUES";case WEDNES:return "WeekDateEnum.WEDNES";case THURS:return "WeekDateEnum.THURS";case FRI:return "WeekDateEnum.FRI";case SATUR:return "WeekDateEnum.SATUR";case SUN:return "WeekDateEnum.SUN";default:return null;}}
}
3、枚举功能测试
/*** 枚举功能测试*/
public class EnumTest {public static void main(String[] args) {//使用普通JAVA类模拟枚举的应用WeekDate weekDate = WeekDate.MON; //获得一个枚举对象//调用枚举中提供的方法System.out.println(weekDate.nextDay()); System.out.println(weekDate.preDay());System.out.println(weekDate.getName());//获得枚举成员所在枚举成员列表中的位置System.out.println(weekDate.getOrdinal());//调用某一个枚举成员的方法System.out.println(WeekDate.values()[0].preDay());System.out.println("---------------遍历枚举成员,普通JAVA类模拟--------------------------");for (WeekDate weekDate2 : WeekDate.values()) {System.out.println(weekDate2);}System.out.println("\n=================================================================\n");//使用JDK中提供的枚举特性功能应用WeekDateEnum weekDateEnum = WeekDateEnum.MON; //获得一个枚举对象System.out.println(WeekDate.values().length); //获得枚举成员数量System.out.println(weekDateEnum.name()); //获得枚举的字符串名称System.out.println(weekDateEnum.toString()); //打印枚举对象,已重写toString方法,默认打印枚举的名称System.out.println(weekDateEnum.nextDay().ordinal()); //枚举成员列表中的位置System.out.println(WeekDateEnum.valueOf("FRI").nextDay().ordinal());System.out.println("---------------遍历枚举成员,使用JDK的枚举特性-------------------------");for (WeekDateEnum enumDemo : WeekDateEnum.values()) {System.out.println(enumDemo);}} }
4、测试结果
转载于:https://www.cnblogs.com/xyang0917/archive/2012/01/08/4172549.html
Java枚举(用Java普通类模拟枚举的实现原理及JDK枚举API使用示例)相关推荐
- 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)
查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...
- 【浅谈JAVA】1-创建汽车类模拟汽车行驶
JAVA创建汽车类模拟汽车行驶设计类-属性:尺寸(长宽高).品牌.时速.最高时速-函数:显示汽车状态.启动汽车.加速.减速.汽车行驶.主函数(程序启动入口并创建对象) 源码- 1.定义一个汽车类类通过 ...
- java中的starts_Java Math类静态double nextAfter(double starts,double direction)示例
java中的starts 数学类静态double nextAfter(双向启动,双向) (Math Class static double nextAfter(double starts , doub ...
- 【Java集合】Java集合一览(汇总)
[Java集合]Java集合一览(汇总) Java Collection Framework中常用类学习 Map HashMap工作原理与实现 LinkedHashMap TreeMap Collec ...
- java枚举类是怎么初始化的,为什么说枚举类是线程安全的
今天写枚举类的时候发现了一个有趣的现象,在这里分享一下: 首先我们定义一个简单的枚举类: /*** @author jinghuaixin* @date 2020/04/30*/ public enu ...
- JAVA中常量使用常量类或者常量接口还是使用枚举,错误代码和中文可变信息的枚举实现
文章目录 关于"JAVA中常量使用常量类或者常量接口还是使用枚举",已有定论-使用枚举,原因就不再展开了. 借助java枚举,可以在定义错误名称和代码的同时,定义中文描述信息,但是 ...
- java实体类中有枚举类型_实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以...
通常,我们都是在业务层和界面层使用枚举类型,这能够为我们编程带来便利,但在数据访问层,不使用枚举类型,因为很多数据库都不支持,比如我们现在用的SqlServer2008就不支持枚举类型的列,用的时候也 ...
- 【java基础】——java枚举类型基本介绍
枚举enum类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示. 1.常量的使用 在JDK1.5之前,我们定义常量都是:public st ...
- Java培训:Java枚举是什么
1.什么是枚举? 枚举是JDK5引入的新特性.在某些情况下,一个类的对象是固定的,就可以定义为枚举.在实际使用中,枚举类型也可以作为一种规范,保障程序参数安全.枚举有以下特点: ①Java中枚举和类. ...
最新文章
- 版本控制8(译文) -(完)
- java基础思维导图
- 压缩图片_Word快速压缩图片大小
- 从链接上获取参数值, location.href上获取参数
- UnityShader9:光照基础回顾
- 驱动过滤透明加密微过滤驱动回顾
- FreeSWITCH折腾笔记3——数据库修改为postgresql
- 二维矩阵顺时针旋转90度
- 银河麒麟Telnet远程登录
- 寻路算法1:A星寻路和navmesh寻路的技巧和优化
- php路由器怎么登录认证,无线路由器Web认证怎么设置 TP路由器启用Web认证功能图文教程...
- AMiner 会议论文推荐第十四期
- win10安装RabbitMQ教程
- bat for循环_bat教程[285] FOR/F options选项中usebackq的用法
- php html转换成word,php如何实现html转换word?_后端开发
- Unity解决动画不可用:The AnimationClip ‘XXX‘ used by the Animation component ‘XXX‘ must be marked as Legacy.
- 地磁传感器_磁感应计_电子罗盘(compass)原理
- 外卖cps行业风雨交加,何去何从
- DATALOAD 基本使用
- 用java解决数字三角形问题(动态规划)
热门文章
- php array_flip() 删除数组重复元素——大彻大悟
- CWnd的派生类-3、CDialog类
- java文本区水平对齐方式,如何将文本居中在水平StackLayout中?
- (3)PCIE中断简介(学无止境)
- (11)System Verilog对象复制
- (49)FPGA面试技能提升篇(仿真加速平台Palladium、Zebu、Veloce)
- jpa使用注解传递对象_注解(下)
- mysql多张表join_mysql 连接查询(多表查询)+子查询-初学教程 3【重点】
- 13003.数据类型转换问题(python)
- 【嵌入式Linux】嵌入式Linux应用开发基础知识之文件IO