一、原始的接口定义常量

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枚举的使用详情(实例与原理分析)相关推荐

  1. android enum java包_Android @IntDef注解取代Java enum枚举提高性能详解

    Android @IntDef注解取代Java enum枚举提高性能 为提高Android性能,Android官方建议使用@IntDef注解替代Java的enum枚举.@IntDef的使用给出一个例子 ...

  2. Java Enum 枚举

    Java Enum(枚举)是一个Java类 enum TestEnum{     a("Foo1"),b("Foo2"),c("Foo3") ...

  3. java enum优点_你需要关注的 Java Enum 枚举的几个细节

    枚举是一个非常古老的语言特性,用来实现具名的有限集合,在 C/C++ 中使用广泛.而 Java 在 Java SE5 才引入枚举.也许语言设计者觉得既然是后引入该特性,那么一定要在这个特性上支持比其他 ...

  4. java enum枚举类的用法以及高级玩法

    enum(枚举)类介绍 java枚举类是一组预定义常量的集合,使用enum关键字声明这个类,常量名称官方建议大写 1.enum类基本用法 举一个常见的例子,例如星期就可以描述为一个枚举类,如下 pub ...

  5. java enum(枚举)使用详解 + 总结

    转:http://www.cnblogs.com/hyl8218/p/5088287.html#undefined enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性, ...

  6. Java enum枚举

    文章目录 1. 枚举例子 2. 接口的实现 3. 枚举中定义抽象方法 enum 定义了枚举类型,其继承于 Enum 枚举类 1. 枚举例子 import java.util.EnumMap; impo ...

  7. Java中的enum详细解析------Java enum 枚举还可以这么用

    在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 1.可以在enum中添 ...

  8. java 反射 速度_Java反射获取实例的速度对比分析

    之前代码有一个逻辑,是在初始化时读取某个包下的所有class文件,放入到一个HashMap里.代码运行过程中,通过Key获取到对应class的全路径名,最后通过Class.forName(classN ...

  9. Java enum(枚举)的用法详解(转)

    用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...

最新文章

  1. 基于SPI协议的Flash全擦除
  2. oracle怎么格式化sql语句,Oracle sqlplus格式化数据
  3. 华为谷歌安装器 Android6.0,GO谷歌安装器华为
  4. DRL实战 : Dynamic Programming
  5. 简单的木马制作并且运用
  6. vue 读取shapefile文件转成GeoJson
  7. mybatis采坑之 PageHelper.startPage出现两个limit情况
  8. 只需两步,让你的iPhone日历显示国家节假日安排
  9. GitHub 中国区前 100 名到底是什么样的人
  10. [proxy:0:0@WORKSTATION-DEV] HYDU_sock_write (utils/sock/sock.c:256): write error (Broken pipe)
  11. JAVA数独解题(四):数对法
  12. 【考研资料】计算机/软件各个大学的考研初试复试资料!附考研群!一直更新...
  13. OpenCV特征检测出现Unhandled exception at……Access violation reading location 0x00000000.
  14. 开关电源常用保护电路-过热、过流、过压以及软启动保护电路
  15. 利用线性回归实现股票预测分析
  16. 只读事务是否做无用功?
  17. 《分布式服务框架原理与实践》读书笔记2
  18. 贝叶斯软件genle教程_贝叶斯网络可视化软件GeNIe使用说明
  19. 4 大软件架构,你们公司用哪种?
  20. 动画动漫网址集锦持续更新

热门文章

  1. 人的执念真的是非常的可怕
  2. 小功能 获取一段汉字的拼音首字母
  3. STM32的RTC简单操作
  4. 波卡链Substrate (1)生态介绍
  5. C++ Primer 5th笔记(chap 17 标准库特殊设施)bernoulli_distribution 类
  6. 跨链Cosmos(8)同构跨链交易流程
  7. Chainlink平台预言机
  8. 智能合约重构社会契约 (1)李嘉图合约
  9. 跨链(2)跨链技术“公证人机制(Notary schemes)”
  10. 设计模式--代理(Proxy)模式