枚举
提出问题
概述
是什么
关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。
分类,各个分类是什么
为什么要用(作用)
应用场景
- 多路分发
- 如果一个系统要分析和执行数学表达式可能会声明Number.plus(Number)等,然而当声明a.plus(b)时,并不知道a或者b的确切类型,则如何让他们进行间交互。
枚举特性
EnumClassMethod
- Class.values方法,返回enum实例的数组,并且该数组中的元素的严格保持其在enum中声明时的顺序。
可以用来遍历enum实例
1 | enum Shrubbery{ GROUND,CRWLING} |
- Enum.valueOf(EnumClass,name)根据给定的名字返回相应的enum实例
EnumObjMethod
- Obj.ordinal()返回一个int值,是每个enum实例在声明时的次序,从0开始。
- Obj.name(),返回enum实例声明时的明智,与使用toString方法效果相同
在Enum中添加方法
Enum除了不能继承自一个enum外,基本上可以将enum看作一个常规的类,即可以向enum添加方法。
若打算在枚举中定义方法,则必须在enum实例序列的最后添加一个分号。
switch中的enum
在Java中switch一般只能使用整数,而枚举实例天生具有整数的次序,因此我们可以在switch中使用
1 | switch(color){ |
多路分发
当要处理多种交互类型时,程序可能会变得相当混乱。
如果一个系统要分析和执行数学表达式可能会声明Number.plus(Number)等,然而当声明a.plus(b)时,并不知道a或者b的确切类型,则如何让他们进行间交互。
Java只支持单路分发,即如果要执行的操作包含了不止一个类型未知的对象,那么Java的动态绑定机制只能处理其中一个的类型。因此我们必须自己去判定其他的类型,从而实现动态绑定。
解决方法就是多路分发,例如两路分发,就必须有两个方法调用:第一个方法调用决定第一个未知类型,第二个方法决定第二个未知类型。
多态实现
1 | public enum Outcome { WIN, LOSE, DRAW } |
- 第一次分发是在a的compete方法当中,此时根据多态识别了a的具体类型
- 第二次分发在调用eval方法,此时多态识别了b的类型
使用enum分发
1 | public enum RoShamBo2 implements Competitor<RoShamBo2> { |
进阶
反省总结
基础
如何构造一个枚举类
- 新建一个Enum的类
- 添加枚举的实例,实例的要求:
- 名称要大写
- 多个单词是使用下划线进行分割
- 实例之间使用逗号分割
- 最后实例结尾使用分号;
- 为类添加字段
- 必须添加构造方法
- 可选:
- 为字段添加getter和setter
- 为实例添加doc注释
代码
1 | public enum SimpleEnum { |
枚举的作用
管理code或者一些常量
在实际项目当中,会遇到一些状态码的相关东西,这个使用枚举进行维护是相对便捷的
进行switch
1 | /** |