java枚举类型使用,Java枚举(用Java普通类模拟枚举的实现原理及JDK枚举API使用示例)

 2023-09-25 阅读 24 评论 0

摘要:枚举的特点: ◆类型安全(Type Safety) ◆紧凑有效的枚举数值定义(Compact, Efficient Declaration of Enumerated Values) ◆无缝的和程序其它部分的交互操作(Seamless integration with other language features) ◆运行的高效率(

枚举的特点:

◆类型安全(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普通类模拟枚举的实现原理

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、测试结果


枚举类型java、转载于:https://www.cnblogs.com/xyang0917/archive/2012/01/08/4172549.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/95800.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息