第二十二章 枚举

基本 enum 特性

创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum

valueOf() 是在 Enum 中定义的 static 方法,它根据给定的名字返回相应的 enum 实例,如果不存在给定名字的实例,将会抛出异常。

将静态类型导入用于 enum

使用 static import 能够将 enum 实例的标识符带入当前的命名空间,所以无需再用 enum 类型来修饰 enum 实例。

方法添加

除了不能继承自一个 enum 之外,我们基本上可以将 enum 看作一个常规的类。也就是说我们可以向 enum 中添加方法。enum 甚至可以有 main() 方法。

我们只能在 enum 定义的内部使用其构造器创建 enum 实例。一旦 enum 的定义结束,编译器就不允许我们再使用其构造器来创建任何实例了。

覆盖 enum 的方法

覆盖 toSring() 方法,给我们提供了另一种方式来为枚举实例生成不同的字符串描述信息。

values 方法的神秘之处

编译器创建的 enum 类都继承自 Enum 类,然而 Enum 类并没有 values() 方法。values() 是由编译器添加的 static 方法。编译器还为其添加了 valueOf() 方法。Enum 中的 valueOf() 方法需要两个参数,而这个新增的方法只需一个参数。

由于 values() 方法是由编译器插入到 enum 定义中的 static 方法,所以,如果你将 enum 实例向上转型为 Enum,那么 values() 方法就不可访问了。不过,在 Class 中有一个 getEnumConstants() 方法,所以即便 Enum 接口中没有 values() 方法,我们仍然可以通过 Class 对象取得所有 enum 实例。

enum Search {HITHER, YON
}public class UpcastEnum {public static void main(String[] args) {Search[] vals = Search.values();Enum e = Search.HITHER; // Upcast// e.values(); // No values() in Enumfor (Enum en : e.getClass().getEnumConstants())System.out.println(en);}
}

实现而非继承

所有的 enum 都继承自 Java.lang.Enum 类。由于 Java 不支持多重继承,所以你的 enum 不能再继承其他类,然而,在我们创建一个新的 enum 时,可以同时实现一个或多个接口。

使用接口组织枚举

在一个接口的内部,创建实现该接口的枚举,以此将元素进行分组,可以达到将枚举元素分类组织的目的。

public interface Food {enum Appetizer implements Food {SALAD, SOUP, SPRING_ROLLS;}enum MainCourse implements Food {LASAGNE, BURRITO, PAD_THAI, LENTILS, HUMMOUS, VINDALOO;}enum Dessert implements Food {TIRAMISU, GELATO, BLACK_FOREST_CAKE, FRUIT, CREME_CARAMEL;}enum Coffee implements Food {BLACK_COFFEE, DECAF_COFFEE, ESPRESSO, LATTE, CAPPUCCINO, TEA, HERB_TEA;}
}

使用 EnumSet 替代 Flags

ava SE5 引入 EnumSet,是为了通过 enum 创建一种替代品,以替代传统的基于 int 的“位标志”。EnumSet 的设计充分考虑到了速度因素。

使用 EnumMap

EnumMap 是一种特殊的 Map,它要求其中的键(key)必须来自一个 enum,由于 enum 本身的限制,所以 EnumMap 在内部可由数组实现。EnumMap 的速度很快。

常量特定方法

Java 的 enum 有一个非常有趣的特性,即它允许程序员为 enum 实例编写方法,从而为每个 enum 实例赋予各自不同的行为。要实现常量相关的方法,你需要为 enum 定义一个或多个 abstract 方法,然后为每个 enum 实例实现该抽象方法。

public enum OverrideConstantSpecific {NUT, BOLT, WASHER {@Overridevoid f() {System.out.println("Overridden method");}};void f() {System.out.println("default behavior");}public static void main(String[] args) {for (OverrideConstantSpecific ocs : values()) {System.out.print(ocs + ": ");ocs.f();}}
}

使用 enum 的职责链

在职责链(Chain of Responsibility)设计模式中,程序员以多种不同的方式来解决一个问题,然后将它们链接在一起。当一个请求到来时,它遍历这个链,直到链中的某个解决方案能够处理该请求。

使用 enum 的状态机

枚举类型非常适合用来创建状态机。一个状态机可以具有有限个特定的状态,它通常根据输入,从一个状态转移到下一个状态,不过也可能存在瞬时状态(transient states),而一旦任务执行结束,状态机就会立刻离开瞬时状态。

多路分发

Java 只支持单路分发。也就是说,如果要执行的操作包含了不止一个类型未知的对象时,那么 Java 的动态绑定机制只能处理其中一个的类型。

转载于:https://www.cnblogs.com/huangwenjie/p/11588366.html

20190925 On Java8 第二十二章 枚举相关推荐

  1. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第二十二章 待机唤醒实 ...

  2. stm32 文件系统dma大小_「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验...

    1)实验平台:[正点原子] NANO STM32F103 开发板 2)摘自<正点原子STM32 F1 开发指南(NANO 板-HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 ...

  3. 数字图像处理:第二十二章 基于模型的编码

    第二十二章基于模型的编码 目录 引言 基于对象的编码 基于模型的编码 作业 1. 引言 为了获得更高的压缩效率并保持一定的视频质量以支持超低码率(大约10kbps)双向视频应用,不考虑内容特点的仅仅针 ...

  4. DayDayUp:《机器崛起前传》第二十二章【蹒跚而来】读后感(文章源自网络)—听课笔记

    DayDayUp:<机器崛起前传>第二十二章[蹒跚而来]读后感(文章源自网络)-听课笔记 <机器崛起前传> 1.机器岂不能有自我?         计算机的发展历程可谓蹒跚.从 ...

  5. 第二十二章 5为你的命名空间取个别名

    //第二十二章 5为你的命名空间取个别名 /*#include <iostream> using namespace std; namespace people_compay_boss { ...

  6. 第二十二章 6未命名的命名空间

    //第二十二章 6未命名的命名空间 /*#include <iostream> using namespace std; namespace {int x=2; } namespace { ...

  7. 第二十二章:洗净皮衣

    第二十二章:洗净皮衣 一种心态,希望找到,另外一种心态,不希望找到,两种心态相互的交织着,让李二陛下的内心相当的痛苦. "你又在这里胡思乱想呢."这个时候长孙皇后走了过来,对着李二 ...

  8. 第二十二章 SQL命令 CREATE TRIGGER(二)

    文章目录 第二十二章 SQL命令 CREATE TRIGGER(二) SQL触发器代码 ObjectScript触发代码 字段引用和伪字段引用 引用流属性 引用SQLComputed属性 标签 方法调 ...

  9. 【信息系统项目管理师】第二十二章 信息系统安全管理(考点汇总篇)

    [信息系统项目管理师]第二十二章 信息系统安全管理(考点汇总篇) 考点分析与预测 信息安全为高级科目独有的章节,在第三版教材中有66页的内容.需要掌握的知识点非常多,且知识点非常散,在考试中上午一般考 ...

最新文章

  1. VMware 虚拟化编程(3) —VMware vSphere Web Service API 解析
  2. C语言经典例66-输入3个数a,b,c,按大小顺序输出
  3. android媒体播放框架,Android 使用超简单的多媒体播放器JiaoZiVideoPlayer
  4. jmeter连数据库
  5. 容器入门(2) - podman
  6. oracle表,视图,存储过程,函数,序列.....查询
  7. MongoDB 主从架构
  8. JavaScript事件小结
  9. A*寻路算法基于C#实现
  10. python以及Arduino硬件编程笔记
  11. 我的个人网站,终于上线了!
  12. 猿猿趴架构实战--03 什么是架构
  13. python函数名前带个杠
  14. 顺丰android架构师,顺丰数据库运维架构.pdf
  15. 牺牲一个存储空间的循环队列实现方法
  16. Shiro是如何进行权限管理
  17. matlab第六章课后答案,MATLAB教程2012a第6章习题解答-张志涌
  18. 中国激光碎石术设备市场趋势报告、技术动态创新及市场预测
  19. python openpyxl引用excel公式函数
  20. CSR8670学习笔记:自定义ADK configuration tool配置项

热门文章

  1. python怎么调用函数的返回值_python函数的返回值是什么
  2. pydicom 显示jpeg压缩图像_图像原理 jpg png tga bmp 存储格式
  3. 评分卡模型开发(二)--用户数据异常值处理
  4. 系统学习数字图像处理之描绘子
  5. 建议1 区分4中零值
  6. 2022年考研计算机组成原理_6 总线
  7. OSError: [WinError 126] 找不到指定的模块。【专治疑难杂症】
  8. PAT (Basic Level) Practice1019 数字黑洞
  9. 包是如何通过交换机的
  10. 通过解析器向DNS服务器发出查询