枚举的特点:

◆类型安全(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使用示例)相关推荐

  1. 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)

    查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...

  2. 【浅谈JAVA】1-创建汽车类模拟汽车行驶

    JAVA创建汽车类模拟汽车行驶设计类-属性:尺寸(长宽高).品牌.时速.最高时速-函数:显示汽车状态.启动汽车.加速.减速.汽车行驶.主函数(程序启动入口并创建对象) 源码- 1.定义一个汽车类类通过 ...

  3. java中的starts_Java Math类静态double nextAfter(double starts,double direction)示例

    java中的starts 数学类静态double nextAfter(双向启动,双向) (Math Class static double nextAfter(double starts , doub ...

  4. 【Java集合】Java集合一览(汇总)

    [Java集合]Java集合一览(汇总) Java Collection Framework中常用类学习 Map HashMap工作原理与实现 LinkedHashMap TreeMap Collec ...

  5. java枚举类是怎么初始化的,为什么说枚举类是线程安全的

    今天写枚举类的时候发现了一个有趣的现象,在这里分享一下: 首先我们定义一个简单的枚举类: /*** @author jinghuaixin* @date 2020/04/30*/ public enu ...

  6. JAVA中常量使用常量类或者常量接口还是使用枚举,错误代码和中文可变信息的枚举实现

    文章目录 关于"JAVA中常量使用常量类或者常量接口还是使用枚举",已有定论-使用枚举,原因就不再展开了. 借助java枚举,可以在定义错误名称和代码的同时,定义中文描述信息,但是 ...

  7. java实体类中有枚举类型_实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以...

    通常,我们都是在业务层和界面层使用枚举类型,这能够为我们编程带来便利,但在数据访问层,不使用枚举类型,因为很多数据库都不支持,比如我们现在用的SqlServer2008就不支持枚举类型的列,用的时候也 ...

  8. 【java基础】——java枚举类型基本介绍

    枚举enum类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示. 1.常量的使用 在JDK1.5之前,我们定义常量都是:public st ...

  9. Java培训:Java枚举是什么

    1.什么是枚举? 枚举是JDK5引入的新特性.在某些情况下,一个类的对象是固定的,就可以定义为枚举.在实际使用中,枚举类型也可以作为一种规范,保障程序参数安全.枚举有以下特点: ①Java中枚举和类. ...

最新文章

  1. 版本控制8(译文) -(完)
  2. java基础思维导图
  3. 压缩图片_Word快速压缩图片大小
  4. 从链接上获取参数值, location.href上获取参数
  5. UnityShader9:光照基础回顾
  6. 驱动过滤透明加密微过滤驱动回顾
  7. FreeSWITCH折腾笔记3——数据库修改为postgresql
  8. 二维矩阵顺时针旋转90度
  9. 银河麒麟Telnet远程登录
  10. 寻路算法1:A星寻路和navmesh寻路的技巧和优化
  11. php路由器怎么登录认证,无线路由器Web认证怎么设置 TP路由器启用Web认证功能图文教程...
  12. AMiner 会议论文推荐第十四期
  13. win10安装RabbitMQ教程
  14. bat for循环_bat教程[285] FOR/F options选项中usebackq的用法
  15. php html转换成word,php如何实现html转换word?_后端开发
  16. Unity解决动画不可用:The AnimationClip ‘XXX‘ used by the Animation component ‘XXX‘ must be marked as Legacy.
  17. 地磁传感器_磁感应计_电子罗盘(compass)原理
  18. 外卖cps行业风雨交加,何去何从
  19. DATALOAD 基本使用
  20. 用java解决数字三角形问题(动态规划)

热门文章

  1. php array_flip() 删除数组重复元素——大彻大悟
  2. CWnd的派生类-3、CDialog类
  3. java文本区水平对齐方式,如何将文本居中在水平StackLayout中?
  4. (3)PCIE中断简介(学无止境)
  5. (11)System Verilog对象复制
  6. (49)FPGA面试技能提升篇(仿真加速平台Palladium、Zebu、Veloce)
  7. jpa使用注解传递对象_注解(下)
  8. mysql多张表join_mysql 连接查询(多表查询)+子查询-初学教程 3【重点】
  9. 13003.数据类型转换问题(python)
  10. 【嵌入式Linux】嵌入式Linux应用开发基础知识之文件IO