概述

Java枚举,即enum类型(Enumerate),是JDK1.5的新特性,其加入目的是为了更好的组织常量、增加可读性,使得项目结构更加清晰。

Java枚举本质是什么

本质上可以理解为对于Class写法的一种简略,如

public enum Week{MONDAY;
}

可以先粗浅理解为

public class Week{public static final int MONDAY= 0;
}

在常量较多的情况下,显然省去了冗杂的修饰符,使得代码看起来更加简洁明了。

进阶

而enum做的远不止这些,事实上,对于常量,还可以"赋予"它们属性,也就是说,上面那个粗浅的理解是不准确的,举个实例:

public enum Week{MONDAY(0,"周一"),TUESDAY(1,"周二"),WEDNESDAY(2,"周三"), THURSDAY(3,"周四"), FRIDAY(4,"周五"), SATURDAY(5,"周六"), SUNDAY(6,"周日");// 构造函数private Week(int code, String descibe) {this.code = code;this.descibe = descibe;}// 私有属性private int code;private String descibe;// get方法public int getCode() {return code;}public String getDescibe() {return descibe;}
}

在常量名后面直接加括号,乍一看,也许就有些懵逼了,没关系,让我们写成class的等价形式:

public class WeekNoEnum{// 常量们static final WeekNoEnum MONDAY = new WeekNoEnum(0,"周一"); static final WeekNoEnum TUESDAY = new WeekNoEnum(1,"周二"); static final WeekNoEnum WEDNESDAY = new WeekNoEnum(2,"周三"); static final WeekNoEnum THURSDAY = new WeekNoEnum(3,"周四"); static final WeekNoEnum FRIDAY = new WeekNoEnum(4,"周五"); static final WeekNoEnum SATURDAY = new WeekNoEnum(5,"周六"); static final WeekNoEnum SUNDAY = new WeekNoEnum(6,"周日"); // 构造函数private Week(int code, String descibe) {this.code = code;this.descibe = descibe;}// 私有属性private int code;private String descibe;// get方法public int getCode() {return code;}public String getDescibe() {return descibe;}
}

enum做的就是这种事情,使得定义行不再有那么多的冗余信息。
大部分情况下,把enum想象成有着简略写法的类就可以了。

策略枚举

那么策略枚举又是什么呢?花里胡哨的写法直接头都大了怎么办?
没关系,我们已经知道enum只是普普通通平平常常的类了,此处引用我看到的一篇讲枚举的贴子:
https://www.cnblogs.com/jingmoxukong/p/6098351.html
里面引用了《EffectiveJava》上的一个小例子,这里加了点注释放出来

/*** 枚举的一个小例子,《EffectJava》中使用的策略枚举* * 枚举本质是什么呢?* 枚举创建出的对象(如下文中的星期)本质是 对于*     static final DailyPayroll MONDAY = new DailyPayroll(PayType.WORKDAY);* 的简写* 也就是上述这句话写在class里, 就相当于*     MONDAY(PayType.WORKDAY);* 写在enum里,enum相当于提供了一种规范的模板,能够减少代码量,并且看起来更直观。* 因此,在本例中的策略枚举模块中,两种支付类型必须去实现自己类中没实现的抽象函数。* * @author Nular*/
//public class DailyPayroll {//  static final DailyPayroll MONDAY = new DailyPayroll(PayType.WORKDAY);
public enum DailyPayroll {// 周一到周日,构造其类型分别为工作日和周末MONDAY(PayType.WEEKDAY),TUESDAY(PayType.WEEKDAY), WEDNESDAY(PayType.WEEKDAY), THURSDAY(PayType.WEEKDAY), FRIDAY(PayType.WEEKDAY), SATURDAY(PayType.WEEKEND), SUNDAY(PayType.WEEKEND);// 支付类型的私有常量,作为周一至周日的属性存在。private final PayType payType;// 枚举属性的构造器,用于创建周一至周日的属性DailyPayroll(PayType payType) {this.payType = payType;}/*** 给出工作时长和时薪,计算某一天应支付薪资* @param hoursWorked* @param payRate* @return 某一天的应支付薪资*/double pay(double hoursWorked, double payRate) {return payType.pay(hoursWorked, payRate);}/*** 策略枚举,支付类型,对外透明* @author Nular*/private enum PayType {/***  workday和weekend的支付方式不同,workday是超出基准时间算作加班,而周末全程算作加班。*  因此各自实现了overtimePay进行计算加班应额外支付的工资。*/WEEKDAY {@Overridedouble overtimePay(double hours, double payRate) {return hours <= HOURS_PER_SHIFT ? 0 : (hours - HOURS_PER_SHIFT)* payRate / 2;}},WEEKEND {@Overridedouble overtimePay(double hours, double payRate) {return hours * payRate / 2;}};// 标准工作时长private static final int HOURS_PER_SHIFT = 8;// 加班工资的计算方法,对象必须实现才能够创建abstract double overtimePay(double hrs, double payRate);/*** 由工作时长和时薪计算出不同类型的最终薪资* @param hoursWorked* @param payRate* @return 最终薪资*/double pay(double hoursWorked, double payRate) {double basePay = hoursWorked * payRate;return basePay + overtimePay(hoursWorked, payRate);}}
}

于我而言,初看下最懵逼的也就是如下这段了

     WEEKDAY {@Overridedouble overtimePay(double hours, double payRate) {return hours <= HOURS_PER_SHIFT ? 0 : (hours - HOURS_PER_SHIFT)* payRate / 2;}},WEEKEND {@Overridedouble overtimePay(double hours, double payRate) {return hours * payRate / 2;}};

但是经过上文的铺垫,其实也很好理解,enum中直接写出的常量其实就是new出来的本类对象,那么既然类中含有抽象方法,则必须将其实现,因此需要重写抽象方法,转换成class写法则是这样的:

     public static final PayTypeNoEnum WEEKDAY = new PayTypeNoEnum() {@Overridedouble overtimePay(double hours, double payRate) {return hours <= HOURS_PER_SHIFT ? 0 : (hours - HOURS_PER_SHIFT)* payRate / 2;}};public static final PayTypeNoEnum WEEKEND = new PayTypeNoEnum() {@Overridedouble overtimePay(double hours, double payRate) {return hours * payRate / 2;}};

很常规的内部重写抽象方法。

以上,就是对于Java枚举的一些浅薄的理解,如有疏漏之处还请指出。
最后放一下上述例子的class写法版本,除了定义常量的之外,其实也没什么其他区别。

/*** 不使用枚举,实现枚举相同的功能* 着重用于测试策略枚举的写法* @author Nular**/
public class DailyPayrollNoEnum{static final DailyPayrollNoEnum MONDAY = new DailyPayrollNoEnum(PayTypeNoEnum.WEEKDAY); static final DailyPayrollNoEnum TUESDAY = new DailyPayrollNoEnum(PayTypeNoEnum.WEEKDAY); static final DailyPayrollNoEnum WEDNESDAY = new DailyPayrollNoEnum(PayTypeNoEnum.WEEKDAY); static final DailyPayrollNoEnum THURSDAY = new DailyPayrollNoEnum(PayTypeNoEnum.WEEKDAY); static final DailyPayrollNoEnum FRIDAY = new DailyPayrollNoEnum(PayTypeNoEnum.WEEKDAY); static final DailyPayrollNoEnum SATURDAY = new DailyPayrollNoEnum(PayTypeNoEnum.WEEKEND); static final DailyPayrollNoEnum SUNDAY = new DailyPayrollNoEnum(PayTypeNoEnum.WEEKEND); // 支付类型的私有常量,作为周一至周日的属性存在。private final PayTypeNoEnum payType;// 枚举属性的构造器,用于创建周一至周日的属性DailyPayrollNoEnum(PayTypeNoEnum payType) {this.payType = payType;}double pay(double hoursWorked, double payRate) {return payType.pay(hoursWorked, payRate);}/*** 内部抽象静态类,支付类型,定义了工作日和周末* @author Null**/private abstract static class PayTypeNoEnum {/***  workday和weekend的支付方式不同,workday是超出基准时间算作加班,而周末全程算作加班。*  因此各自实现了overtimePay进行计算加班应额外支付的工资。*/public static final PayTypeNoEnum WEEKDAY = new PayTypeNoEnum() {@Overridedouble overtimePay(double hours, double payRate) {return hours <= HOURS_PER_SHIFT ? 0 : (hours - HOURS_PER_SHIFT)* payRate / 2;}};public static final PayTypeNoEnum WEEKEND = new PayTypeNoEnum() {@Overridedouble overtimePay(double hours, double payRate) {return hours * payRate / 2;}};// 标准工作时长private static final int HOURS_PER_SHIFT = 8;// 加班工资的计算方法,对象必须实现才能够创建abstract double overtimePay(double hrs, double payRate);/*** 由工作时长和时薪计算出最终薪资* @param hoursWorked* @param payRate* @return 最终薪资*/double pay(double hoursWorked, double payRate) {double basePay = hoursWorked * payRate;return basePay + overtimePay(hoursWorked, payRate);}}
}

Java枚举是什么?关于Java枚举的一些理解相关推荐

  1. java 枚举的继承_java中枚举类可以被继承吗?

    java 枚举类 java中,使用关键字enum来定义枚举类,枚举类是一个特殊的类,大部分功能和普通类是一样的,区别为: ● 枚举类继承了java.lang.Enum类,而不是默认的Object类.而 ...

  2. java 枚举使用简书_Java枚举

    1.简介 java中,使用关键字enum来定义枚举类,枚举类是一个特殊的类,大部分功能和普通类是一样的,区别为: 枚举类继承了java.lang.Enum类,而不是默认的Object类.而java.l ...

  3. 如何从Java中的字符串值获取枚举值?

    说我有一个枚举 public enum Blah {A, B, C, D } 我想找到一个字符串的枚举值,例如"A"就是Blah.A 怎么可能做到这一点? Enum.valueOf ...

  4. JAVA(四)类集/枚举

    成鹏致远 | lcw.cnblog.com |2014-02-04 JAVA类集 1.认识类集 类集的作用 类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集中的对象内容可以任意扩充 类集的 ...

  5. java 枚举使用简书_java枚举类型使用和详解

    1.定义 An enum type is a special data type that enables for a variable to be a set of predefined const ...

  6. java enum 定义属性_java enum(枚举)使用详解 + 总结

    enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容: 8. 总结 ...

  7. Java修炼之路——基础篇——枚举

    枚举的用法 每个枚举变量其实都是枚举类的一个实例. 枚举与单例 各种模式的单例模式,包括枚举实现的单例 //懒汉模式 class SingletonA {private static Singleto ...

  8. Java、Mysql、MyBatis 中枚举 enum 的使用

    From: https://yulaiz.com/java-mysql-enum/ Java 和 MySql 中都有枚举的概念,合理的使用枚举,可以让代码阅读和数据库数据查询更加直观.高效.那么我们怎 ...

  9. 什么是java枚举_什么是java枚举

    什么是java枚举? java 枚举的定义与用法 一.枚举的定义: 枚举是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类型多了些特殊的约束,但是这些约束的存在也造就了枚举类 ...

  10. 枚举工具类 EnumUtils.java

    简介 EnumUtils工具类, 用于读取枚举中的code和value值. 使用有限制, 枚举类必须提供 getCode 和  getValue 两个方法,例如 NODEFINE("未定义& ...

最新文章

  1. DeepMind 再发 Nature,图神经网络解决物理难题
  2. 安装fiddler做代理,本地开发手机端看效果
  3. springboot集成mybatis-generator时候遇到的问题
  4. 生产过程中计算机软件的确认--简述医疗器械生产过程确认
  5. Python Django 基于通用视图实现图片的显示功能代码示例
  6. mysql connector配置_mysql connector odbc配置注意事项
  7. C++ explicit关键字
  8. High ASCII字符从bat文件到dos控制台的转化问题
  9. nginx配置url重定向-反向代理
  10. C11头文件threads.h声明了创建和管理线程,信号,条件变量的函数
  11. 批量更改文件名的批处理文件
  12. 国际首个!OpenV2X 开源社区成立,填补 5G 路侧开放基础架构(RSOI)空白
  13. 希尔密码(原理+代码)
  14. cad2016中选择全图字体怎么操作_一键完成CAD转PDF,CAD编辑,CAD打印,无奈没人知道这波骚操作!...
  15. Tomcat配置域名访问
  16. NextCloud如何共享文件
  17. hive sql中常用技巧
  18. ubuntu 14.04安装flash播放器
  19. 微积分学习笔记(2)--修改更新中
  20. vsftpd基本使用

热门文章

  1. Latex中一些特殊常用符号的输入
  2. VS 2019 命令提示符 相关命令
  3. 共好:为管理者提供指南(肯·布兰佳)
  4. Arduino Uno 火焰传感器实验
  5. R语言学习20150414
  6. 搭建MYSQL的mmm架构出现 master/AWAITING_RECOVERY. Roles报错
  7. 清华大学 zhongguo li 计算机,清华大学学者发表论文列表_郭美凤
  8. IOS UITableView 改变编辑模式下的移动图标
  9. 维嘉科技IPO被终止:年营收8亿 邱四军控制61%股权
  10. 解决Android在更新安装包时出现“未安装应用”的情况