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),是枚举中的实例(如图中的REDGREEN等)的构造方法(即:是具体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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值