Java枚举Enum
枚举可以单独定义为一个类,也可以嵌在其它Java类中。
如果枚举嵌套在其他类中,那么它的位置应该在:成员变量位置。
枚举其实就是一个特殊的常量类!
枚举的基本结构为:
注:enum有点像class,但是由于其又可以放在类中,所以其要比class“低位”一点。
注:如果枚举类放在一个正常的class中,那么该枚举类型默认是final static修饰的,且该枚举类中的实例也是默认由final static修饰的。
一些特性,在下面列举出来的一系列用法中再详细说明。
我们可以这样获取到枚举中的实例(如下图所示):
常用用法一:常量
枚举的位置应该出现在成员变量位置,如图所示(示例):
常用用法二:switch
在switch结构中,对枚举的运用(示例):
常用用法三:向枚举中添加新方法
如果打算在枚举型中定义自己的方法,那么必须在enum实例序列的最后添加一个分号(注:如果 java枚举型中同时有实例和方法时,那么必须先定义 enum 实例,下图中RED,GREEN,BLANK,YELLOW是实例):
注: 在枚举中的静态方法,枚举类(这里是Color)和枚举类中的实例(这里是RED等)均可调用;在枚举中的非静态方法,枚举类中的实例(这里是RED等)才可调用。
注:枚举中的封装(如图中的name,index),是对枚举中的实例(如图中的RED等)的参数的封装,而不是对枚举中的实例的封装。
注:枚举中的构造方法(如图中的private Color),是枚举中的实例(如图中的RED、GREEN等)的构造方法(即:是具体Color的构造,而非Color本身的构造)。
常用用法四:覆盖枚举的方法
示例:
注: 写在枚举中的非静态方法,是不能直接通过枚举类型名字(Coloe)直接调用的,需要使用其实例(RED等)进行调用。
常用用法五:实现接口
示例:
常用用法六:同一接口中使用多个枚举来实现
注:这样的好处是,分类明确
示例:
接口是这样的:
测试:
常用用法七:枚举集合的使用
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。
给出一个Enum日期工具类示例(这里是将Enum单独拿出来作为一个类,与直接放在其他类中是一样的):
第一步:引入依赖
提示:version报黄了,说明此SpringBoot的版本默认有该joda的版本选定,这里我们可以不用指定version。
第二步:创建Enum类
DateTimeConverter.java中:
给出文字版:
import java.util.Date; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter;
/** * 枚举类demo * * @author JustryDeng * @date 2018年6月25日 下午1:53:07 */ public enum DateTimeConverter {
/** 实例属性 */ COPPACT_DATE("yyyyMMdd"), COPPACT_DATE_TIME("yyyyMMddHHmmss"), COPPACT_DATE_TIME_MILLISECOND( "yyyyMMddHHmmssSSS"), REGULAR_DATE( "yyyy-MM-dd"), REGULAR_DATE_TIME("yyyy-MM-dd HH:mm:ss"), REGULAR_DATE_TIME_MILLISECOND( "yyyy-MM-dd HH:mm:ss.SSS"), SLASH_DATE("yyyy/MM/dd"), SLASH_DATE_TIME( "yyyy/MM/dd HH:mm:ss"), SLASH_DATE_TIME_MILLISECOND("yyyy/MM/dd HH:mm:ss.SSS");
/** 日期时间样式模板(对应实例属性中的'属性') */ private final DateTimeFormatter formatter;
/** * 构造方法(对应实例属性的'构造方法') * * @param formatter * 日期时间样式模板 */ private DateTimeConverter(final String formatter) { this.formatter = DateTimeFormat.forPattern(formatter); System.out.println(">>>>>>>>>>>>>>>" + formatter); }
/** * 将当前时间转化为指定的样式 * * @return 指定样式的日期时间字符串 * @date 2018年6月25日 下午2:05:49 */ public String now() { return new DateTime().toString(formatter); }
/** * 将Date数据转化为对应格式的String字符串 * * @param date * 日期对象 * @return 指定格式的日期时间字符串 * @date 2018年6月25日 下午2:06:46 */ public String convert(Date date) { return date == null ? new DateTime().toString(formatter) : new DateTime(date).toString(formatter); }
/** * 将一定日期时间格式的字符串转化为Date对象 * * @param dateString * 日期时间格式的字符串 * @return Date对象 * @date 2018年6月25日 下午2:08:10 */ public Date convert(String dateString) { return dateString == null || dateString.isEmpty() ? new Date() : formatter.parseDateTime(dateString).toDate(); } } |
我们编写JUnit测一下:
控制台输出结果为:
这是我以前做的笔记,这次加了点新的内容;以前做此笔记时,参考了好几个人的 博客资料等,具体的我记不得了,如若涉及到侵权问题,请联系我。
如有不当之处,欢迎指正
本文已经被收录进《程序员成长笔记(二)》,作者JustryDeng