枚举类型
-
关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用
-
基本enum特性
enum.values();//遍历enum实例,返回enum实例数组。数组中的元素保持其在enum声明时的顺序 enum.ordinal();//返回每个enum实例在声明时的次序 enum.getDeclaringClass();//知道其所属的enum的类 enum.valueOf();//它根据给定的名字返回相应的enum实例 enum.name();//返回enum实例声明时的额名字,与使用toString()方法效果相同
-
向enum中添加新方法
- 为枚举实例添加构造器,专门负责处理额外的信息,然后添加一个方法,返回这个描述信息。
- 如果定义自己的方法,必须在enum实例序列的最后添加分好,同时,Java要求你必须先定义enum实例。
- 覆盖enum的方法:与覆盖一般类的方法一致
- enum都继承自java.lang.Enum类,由于Java不支持多继承,所以在创建一个新的enum时,可以实现一个或多个接口
- JDK1.6之前switch只支持int、char,之后支持enum类型,能让我们的代码可读性更强。
-
EnumSet替代标志
- enum要求其成员都是唯一的,所以enum看起来也具有集合的行为。不过不能从enum中删除或添加元素。
- Java SE5引入EnumSet ,是为了通过enum创建一种替代传统的基于int的“位标志”
- EnumSet的速度非常快。使用优点是,他在说明一个二进制位是否存在是,具有更好的表达能力,并且性能佳。EnumSet中的元素必须来自于一个enum
- enum实例定义的次序决定了在EnumSet的顺序
-
EnumMap
- 一种特殊的map,他要求其中的键必须来自一个enum。
- 由于Enum本身的限制,EnumMap内部可由数组实现。只能将enum实例作为键来调用put(),其他操作与一般map无区别。
- enum实例定义的次序决定了在EnumMap的顺序
- EnumMap允许改变值对象
-
常量相关的方法
- enum要实现常量相关的方法,需要为enum定义一个或多个abstract方法,然后为每个enum实例实现该抽象方法。通过enum实例,可以调动其上的方法,称之为表驱动的代码
- enum也可覆盖常量相关的方法
- 职责链:在职责链设计模式中,程序员以多种不同的方式来解决一个问题,然后将他们链接在一起。当一个请求到来时,它遍历这个链,直到链中的某个解决方案能够处理该请求
- 状态机:一个状态机可以具有有限个特定的状态,它通常根据输入,从一个状态转移到下一个状态,不过也可能存在瞬时状态。而一旦任务结束,状态机就会离开瞬时状态。每个状态都有一些可接受的输入,不同的输入会使状态机从当前状态转移到不同的新状态
-
多路分发
- Java只支持单路分发。也就是说,如果要执行的操作包含了不止一个类型未知的对象时,那么Java动态绑定机制只能处理其中一个类型。
- 使用enum分发、使用常量相关的方法、使用EnumMap分发、使用二维数组