java enum枚举的使用详情(实例与原理分析)
一、原始的接口定义常量
public interface IConstants {String MON = "Mon";String TUE = "Tue";String WED = "Wed";String THU = "Thu";String FRI = "Fri";String SAT = "Sat";String SUN = "Sun";
}
二、语法(定义)
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
package com.sihai.test;
/*** 枚举测试类* @author */
public enum EnumTest {MON, TUE, WED, THU, FRI, SAT, SUN;
}这段代码实际上调用了7次 Enum(String name, int ordinal):
new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
三、遍历、switch 等常用操作
对enum进行遍历和switch的操作示例代码:
public class Test {public static void main(String[] args) {for (EnumTest e : EnumTest.values()) {System.out.println(e.toString());}System.out.println("----------------我是分隔线------------------");EnumTest test = EnumTest.TUE;switch (test) {case MON:System.out.println("今天是星期一");break;case TUE:System.out.println("今天是星期二");break;// ... ...default:System.out.println(test);break;}}
}
输出结果:
MON
TUE
WED
THU
FRI
SAT
SUN
----------------我是分隔线------------------
今天是星期二
四、enum 对象的常用方法介绍
int compareTo(E o)
比较此枚举与指定对象的顺序。
Class getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString()
返回枚举常量的名称,它包含在声明中。
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。
public class Test {public static void main(String[] args) {EnumTest test = EnumTest.TUE;//compareTo(E o)switch (test.compareTo(EnumTest.MON)) {case -1:System.out.println("TUE 在 MON 之前");break;case 1:System.out.println("TUE 在 MON 之后");break;default:System.out.println("TUE 与 MON 在同一位置");break;}//getDeclaringClass()System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());//name() 和 toString()System.out.println("name(): " + test.name());System.out.println("toString(): " + test.toString());//ordinal(), 返回值是从 0 开始System.out.println("ordinal(): " + test.ordinal());}
}
输出结果:
TUE 在 MON 之后
getDeclaringClass(): com.sihai.test.EnumTest
name(): TUE
toString(): TUE
ordinal(): 1
给 enum 自定义属性和方法
五、EnumSet,EnumMap 的应用
public class Test {public static void main(String[] args) {// EnumSet的使用EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);for (EnumTest day : weekSet) {System.out.println(day);}// EnumMap的使用EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);weekMap.put(EnumTest.MON, "星期一");weekMap.put(EnumTest.TUE, "星期二");// ... ...for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {Entry<EnumTest, String> entry = iter.next();System.out.println(entry.getKey().name() + ":" + entry.getValue());}}
}
六、举例
有构造方法的枚举类(构造方法有一个参数),下面是比较常用的一种方式:
/*** 任务状态枚举类* Created by sihaion 2017/4/27.*/
public enum TaskStatusEnum {NotStart(0), //未开始Doing(1), //执行中Pause(2), //暂停Completed(3), //已完成Del(4), //删除CutShort(5) ; //提前结束private int value;TaskStatusEnum(int value) {this.value=value;}public int getValue(){return value;}/*** 根据value返回对应的枚举值* @param value* @return*/public static TaskStatusEnum valueOf(int value) {switch (value) {case 0: return NotStart;case 1: return Doing;case 2: return Pause;case 3: return Completed;case 4: return Del;case 5: return CutShort;default: return null;}}
}
订单状态枚举类:
/*** 订单状体枚举类* Created by sihaion 2017/5/1.*/
public enum OrderStatus {WaitPay(0), //等待支付Paid(1), //已经支付Expired(2), //已经失效Force(3); //已经生效private int value;OrderStatus(int value) {this.value=value;}public int getValue(){return value;}public static OrderStatus valueOf(int value) {switch (value) {case 0:return WaitPay;case 1:return Paid;case 2:return Expired;case 3:return Force;default:return null;}}
}
消息状态枚举类:
/*** 消息状态枚举类* Created by sihaion 2017/5/1.*/
public enum MessageStatus {Read(1),//已读UnRead(0);//未读private int value;MessageStatus(int value) {this.value=value;}public int getValue(){return value;}public static MessageStatus valueOf(int value) {switch (value) {case 1:return Read;case 0:return UnRead;default:return null;}}
}
月份的枚举类:
/*** 月份枚举类* Created by sihaion 2017/5/1.*/
public enum MonthEnum {Jan(1),Feb(2),Mar(3),Apr(4),May(5),Jun(6),Jul(7),Aug(8),Sep(9),Oct(10),Nov(11),Dec(12);private Integer index;public Integer getIndex() {return index;}MonthEnum(Integer index) {this.index = index;}/*** 根据索引获取对应的枚举对象* @param index* @return*/public static MonthEnum getEnumTypeByIndex(Integer index) {MonthEnum[] values = MonthEnum.values();for (MonthEnum value : values) {if (value.getIndex() == index) {return value;}}return null;}
}
用法举例:
/*** Created by sihaion 2017/4/30.*/
public class AppTest {public static void main(String[] args) {Integer index = MonthEnum.Apr.getIndex();//输出: Apr这个枚举值对应的索引为: 4System.out.println("Apr这个枚举值对应的索引为:\t" + index);//输出: 索引4对应的枚举值为: AprMonthEnum monthEnum = MonthEnum.getEnumTypeByIndex(4);System.out.println("索引4对应的枚举值为:\t" + monthEnum.name());}
}
注意:
枚举中的所有构造方法都必须是private修饰,如果不加任何修饰符,默认就是private修饰。
枚举类中定义的工具方法getEnumTypeByIndex()使用static修饰,这样才能通过MonthEnum.getEnumTypeByIndex(4)的方式来调用。
枚举类的构造方法有两个参数的情况:
import java.util.HashMap;
import java.util.Map;/*** 星期枚举类* Created by sihaion 2017/5/1.*/
public enum WeekDayEnum {SUN(0, "星期日"),MON(1, "星期一"),TUE(2, "星期二"),WED(3, "星期三"),THUR(4, "星期四"),FRI(5, "星期五"),SAT(6, "星期六");private Integer index;private String key;WeekDayEnum(Integer index, String key) {this.index = index;this.key = key;}public String getKey() {return key;}public Integer getIndex() {return index;}/*** 根据枚举名称得到key* 比如根据"WED"得到"星期三"* @param name* @return*/public static String getKeyByName(String name) {WeekDayEnum[] values = WeekDayEnum.values();for (WeekDayEnum value : values) {if (value.name().equals(name)) {return value.getKey();}}return null;}/*** 根据属性key获取属性index:* 比如根据 "星期三" 得到 3* @param key* @return*/public static Integer getIndexByKey(String key) {for (WeekDayEnum weekDayEnum : WeekDayEnum.values()) {String k = weekDayEnum.getKey();if (k.equals(key)) {return weekDayEnum.getIndex();}}return null;}/*** 根据属性index获取属性key:* 比如根据 3 得到 "星期三"* @param index* @return*/public static String getKeyByIndex(Integer index) {for (WeekDayEnum weekDayEnum : WeekDayEnum.values()) {Integer in = weekDayEnum.getIndex();if (in == index) {return weekDayEnum.getKey();}}return null;}/*** 根据属性index获取对应的枚举值:* 比如根据 3 得到枚举值 WED* @param index* @return*/public static WeekDayEnum getTypeByIndex(Integer index) {for (WeekDayEnum value : WeekDayEnum.values()) {if (value.getIndex() == index) {return value;}}return null;}/*** 返回一个由index和key组成的map集合:* {0=星期日, 1=星期一, 2=星期二, 3=星期三, 4=星期四, 5=星期五, 6=星期六}* @return*/public static Map<Integer, String> getIndexKeyMap() {Map<Integer, String> map = new HashMap<>();for (WeekDayEnum value : WeekDayEnum.values()) {Integer index = value.getIndex();String key = value.getKey();map.put(index, key);}return map;}
}
用法举例:
import java.util.Map;/*** Created by sihaion 2017/4/30.*/
public class AppTest {public static void main(String[] args) {Integer index = WeekDayEnum.getIndexByKey("星期日");System.out.println(index);//输出 0String key = WeekDayEnum.getKeyByIndex(0);System.out.println(key);//输出 星期日String keyByName = WeekDayEnum.getKeyByName("SAT");System.out.println(keyByName);//输出 星期六Map<Integer, String> map = WeekDayEnum.getIndexKeyMap();//输出 {0=星期日, 1=星期一, 2=星期二, 3=星期三, 4=星期四, 5=星期五, 6=星期六}System.out.println(map);}
}
构造方法的参数有多个情况:
import java.util.ArrayList;
import java.util.List;/*** Created by sihaion 2017/5/1.*/
public enum WeekDayEnumX {SUN(0, "星期日", "Sunday"),MON(1, "星期一", "Monday"),TUE(2, "星期二", "Tuesday"),WED(3, "星期三", "Wednesday"),THUR(4, "星期四", "Thursday"),FRI(5, "星期五", "Friday"),SAT(6, "星期六", "Saturday");private Integer index;//索引private String cn;//中文表示private String en;//英文表示WeekDayEnumX(Integer index, String cn, String en) {this.index = index;this.cn = cn;this.en = en;}public static String getCnByIndex(Integer index) {WeekDayEnumX[] values = WeekDayEnumX.values();for (WeekDayEnumX value : values) {if (value.index == index) {return value.cn;}}return null;}public static String getEnByIndex(Integer index) {WeekDayEnumX[] values = WeekDayEnumX.values();for (WeekDayEnumX value : values) {if (value.index == index) {return value.en;}}return null;}/*** 获取所有的索引list* @return*/public static List<Object> getAllIndex() {List<Object> list = new ArrayList<>();WeekDayEnumX[] values = WeekDayEnumX.values();for (WeekDayEnumX value : values) {list.add(value.index);}return list;}/*** 将枚举值中的所有属性封装到一个list集合中* @return*/public static List<List<Object>> getAll() {List<List<Object>> lists = new ArrayList<>();WeekDayEnumX[] values = WeekDayEnumX.values();for (WeekDayEnumX value : values) {List<Object> elementList = new ArrayList<>();elementList.add(value.name());elementList.add(value.index);elementList.add(value.cn);elementList.add(value.en);lists.add(elementList);}return lists;}
}
用法举例:
import java.util.List;/*** Created by sihaion 2017/4/30.*/
public class AppTest {public static void main(String[] args) {List<Object> allIndex = WeekDayEnumX.getAllIndex();System.out.println(allIndex);//输出 [0, 1, 2, 3, 4, 5, 6]List<List<Object>> allList = WeekDayEnumX.getAll();for (List<Object> list : allList) {/*** 输出结果:* * [SUN, 0, 星期日, Sunday]* [MON, 1, 星期一, Monday]* [TUE, 2, 星期二, Tuesday]* [WED, 3, 星期三, Wednesday]* [THUR, 4, 星期四, Thursday]* [FRI, 5, 星期五, Friday]* [SAT, 6, 星期六, Saturday]*/System.out.println(list);}}
}
带有抽象方法的枚举类:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** Created by sihaion 2017/5/1.*/
public enum WeekDayEM {SUN {@Overridepublic Integer getValue() {return 0;}@Overridepublic String getKey() {return "星期日";}},MON {@Overridepublic Integer getValue() {return 1;}@Overridepublic String getKey() {return "星期一";}},TUE {@Overridepublic Integer getValue() {return 2;}@Overridepublic String getKey() {return "星期二";}},WED {@Overridepublic Integer getValue() {return 3;}@Overridepublic String getKey() {return "星期三";}},THU {@Overridepublic Integer getValue() {return 4;}@Overridepublic String getKey() {return "星期四";}},FRI {@Overridepublic Integer getValue() {return 5;}@Overridepublic String getKey() {return "星期五";}},SAT {@Overridepublic Integer getValue() {return 6;}@Overridepublic String getKey() {return "星期六";}};public abstract Integer getValue();public abstract String getKey();/*** 返回由key和value组成的map集合:* {星期二=2, 星期六=6, 星期三=3, 星期四=4, 星期五=5, 星期日=0, 星期一=1}* @return*/public static Map<String, Object> getKeyValueMap() {HashMap<String, Object> map = new HashMap<>();WeekDayEM[] values = WeekDayEM.values();for (WeekDayEM value : values) {String k = value.getKey();Integer v = value.getValue();map.put(k, v);}return map;}/*** 返回由所有key组成的list集合:* [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六]* @return*/public static List<Object> getAllKey() {List<Object> keyList = new ArrayList<>();WeekDayEM[] values = WeekDayEM.values();for (WeekDayEM value : values) {String k = value.getKey();keyList.add(k);}return keyList;}/*** 返回由所有value组成的list集合:* [0, 1, 2, 3, 4, 5, 6]* @return*/public static List<Object> getAllValue() {List<Object> valueList = new ArrayList<>();WeekDayEM[] values = WeekDayEM.values();for (WeekDayEM value : values) {Integer v = value.getValue();valueList.add(v);}return valueList;}
}
在上面的枚举类中,定义了两个抽象方法:
所以每一个枚举值(对象)都必须实现这两个抽象方法。
用法举例:
/*** Created by sihaion 2017/4/30.*/
public class AppTest {public static void main(String[] args) {String key = WeekDayEM.THU.getKey();Integer value = WeekDayEM.THU.getValue();//输出 星期四, 4System.out.println(key + ", " + value);}
}
七、原理分析
enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum。EnumTest 经过反编译(javap com.sihai.test.EnumTest 命令)之后得到的内容如下:
public class com.sihai.test.EnumTest extends java.lang.Enum{public static final com.sihai.test.EnumTest MON;public static final com.sihai.test.EnumTest TUE;public static final com.sihai.test.EnumTest WED;public static final com.sihai.test.EnumTest THU;public static final com.sihai.test.EnumTest FRI;public static final com.sihai.test.EnumTest SAT;public static final com.sihai.test.EnumTest SUN;static {};public int getValue();public boolean isRest();public static com.sihai.test.EnumTest[] values();public static com.sihai.test.EnumTest valueOf(java.lang.String);com.sihai.test.EnumTest(java.lang.String, int, int, com.sihai.test.EnumTest);
}
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
八、总结
可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。
java enum枚举的使用详情(实例与原理分析)相关推荐
- android enum java包_Android @IntDef注解取代Java enum枚举提高性能详解
Android @IntDef注解取代Java enum枚举提高性能 为提高Android性能,Android官方建议使用@IntDef注解替代Java的enum枚举.@IntDef的使用给出一个例子 ...
- Java Enum 枚举
Java Enum(枚举)是一个Java类 enum TestEnum{ a("Foo1"),b("Foo2"),c("Foo3") ...
- java enum优点_你需要关注的 Java Enum 枚举的几个细节
枚举是一个非常古老的语言特性,用来实现具名的有限集合,在 C/C++ 中使用广泛.而 Java 在 Java SE5 才引入枚举.也许语言设计者觉得既然是后引入该特性,那么一定要在这个特性上支持比其他 ...
- java enum枚举类的用法以及高级玩法
enum(枚举)类介绍 java枚举类是一组预定义常量的集合,使用enum关键字声明这个类,常量名称官方建议大写 1.enum类基本用法 举一个常见的例子,例如星期就可以描述为一个枚举类,如下 pub ...
- java enum(枚举)使用详解 + 总结
转:http://www.cnblogs.com/hyl8218/p/5088287.html#undefined enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性, ...
- Java enum枚举
文章目录 1. 枚举例子 2. 接口的实现 3. 枚举中定义抽象方法 enum 定义了枚举类型,其继承于 Enum 枚举类 1. 枚举例子 import java.util.EnumMap; impo ...
- Java中的enum详细解析------Java enum 枚举还可以这么用
在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 1.可以在enum中添 ...
- java 反射 速度_Java反射获取实例的速度对比分析
之前代码有一个逻辑,是在初始化时读取某个包下的所有class文件,放入到一个HashMap里.代码运行过程中,通过Key获取到对应class的全路径名,最后通过Class.forName(classN ...
- Java enum(枚举)的用法详解(转)
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...
最新文章
- 基于SPI协议的Flash全擦除
- oracle怎么格式化sql语句,Oracle sqlplus格式化数据
- 华为谷歌安装器 Android6.0,GO谷歌安装器华为
- DRL实战 : Dynamic Programming
- 简单的木马制作并且运用
- vue 读取shapefile文件转成GeoJson
- mybatis采坑之 PageHelper.startPage出现两个limit情况
- 只需两步,让你的iPhone日历显示国家节假日安排
- GitHub 中国区前 100 名到底是什么样的人
- [proxy:0:0@WORKSTATION-DEV] HYDU_sock_write (utils/sock/sock.c:256): write error (Broken pipe)
- JAVA数独解题(四):数对法
- 【考研资料】计算机/软件各个大学的考研初试复试资料!附考研群!一直更新...
- OpenCV特征检测出现Unhandled exception at……Access violation reading location 0x00000000.
- 开关电源常用保护电路-过热、过流、过压以及软启动保护电路
- 利用线性回归实现股票预测分析
- 只读事务是否做无用功?
- 《分布式服务框架原理与实践》读书笔记2
- 贝叶斯软件genle教程_贝叶斯网络可视化软件GeNIe使用说明
- 4 大软件架构,你们公司用哪种?
- 动画动漫网址集锦持续更新