java编程思想读书笔记 第十九章 枚举类型

关键字enum可以将一组具名的值的有限集合创建问一种新的类型,而这些具名的值可以作为常规的程序组件使用。

1. 基本的enum的特性
1)enum的values()方法,可以遍历enum实例。values()方法返回enum实例的数组,而且该数组中的元素严格保持其在enum中声明时的顺序,因此可以在循环中使用values()返回的数组。
2)enum的ordinal()方法返回式一个int值,这个表示的是每个enum实例在声明时的次序,从0开始。
3)可以使用==来比较enum的实例,编译器会自动为你提供equals()和hashCode()方法。
4)Enum类实现了Comparable接口,所以它具有compareTo()方法,同时还实现了Srializable接口
5)enum的getDeclaringClass()方法,可以知道其所属的enum类。
6)enum的name()方法返回的是enum实例声明时的名字,这与使用toString()方法效果相同。
7)enum中的valueOf(),是根据给定的名字返回相应的enum实例,如果不存在给定名字的实例,将会抛出异常。

2. 向enum中添加新方法
除了不能继承自一个enum之外,基本上可以将enum看作一个常规的类。也就是说,可以向enum中添加方法。enum甚至可以有main()方法。
1)提供一个构造器专门处理额外的信息,然后添加一个方法就可以使每个枚举实例能够返回对自身的描述;
2)如果要定义自己的方法,那么必须在enum实例序列的最后添加一个分号,同时也要先定义enum实例;
3)注意的是只能在enum定义的内部使用其构造器创建enum实例;
4)通过覆盖toString()方法,可以提供一种方式来为枚举实例生成不同的字符串描述信息。

3. switch语句中的enum
在switch中使用enum,是enum提供的一项非常便利的功能,一般来说在switch中只能使用整数值,而枚举实例天生就具备整数值的次序,并且可以通过ordinal()方法取得其次序,因此可以在switch中使用enum。

4. values()的神秘之处
前面提到的values()是由编译器添加的static方法。所以,如果你将enum实例向上转型为Enum,那么values()方法就不可以访问了。不过,在Class中有一个getEnumConstans()方法,所以即便Enum接口中没有values()方法,仍然可以通过Class对象取得所有enum实例。

5. 实现,而非继承
所有的enum都继承自java.lang.Enum类。由于java不支持多重继承,所以enum不能继承其他类,但是可以同时实现一个或多个接口。

6. 使用接口组织枚举
在一个接口的内部,创建实现该接口的枚举,以此将元素进行分钟,可以达到将枚举元素分类组织的目的。对于enum而言,实现接口时使其子类化的唯一方法。

7. 使用EnumSet替代标志
Set是一种集合,只能向其中添加不重复的对象。当然,enum也要求其成员都是唯一的,所有enum看起来也具有集合的行为。不过,由于enum中不能删除或添加元素,所以它只能算是不太有用的集合。而引入EnumSet是为了通过enum创建一种替代品,以替代传统的基于int的“位标志”。这种标识可以用来表示某种“开/关”信息,不过,使用这种标识,我们最终操作的只是一些bit,而不是这些bit想要表达的概念。
1)EnumSet的优点,它在说明一个二进制位是否存在时,具有更好的表达能力,并且无需担心性能。
2)EnumSet中的元素必须来自一个enum;
3)EnumSet中的of()方法被重载了很多次,不但为可变数量参数进行了重载,而且为接收2至5个显示的参数的情况进行了重载。
4)EnumSet的基础是long,一个long值由64位,而一个enum实例只需一位bit表示其是否存在。也就是说,在不超过一个long的表达能力的情况下,你的EnumSet可以应用于最多不超过64个元素的enum。但是当超过64个元素的enum,Enum会在必要的时候增加一个long。

8.使用EnumMap
EnumMap是一种特殊的Map,它要求其中的键必须来自一个enum。由于enum本身的限制,所以EnumMap在内部可由数字实现。因为EnumMap的速度很快,这样就可以放心地使用enum实例在EnumMap中进行查找操作。不过,我们只能将enum的实例作为键来调用put()方法,其他操作与使用一般的Map差不多。
1)与EnumSet一样,enum实例定义时的次序决定了其在EnumMap中的顺序;
2)当你没有为这个键调用put()方法来存入相应的值的话,其对应的值就是null;
3)与常量相关的方法相比,EnumMap有一个优点,那EnumMap允许程序员改变值对象,而常量相关的方法在编译器就固定了。

9.常量相关的方法
enum有一个特性,即它允许程序员为enum实例编写方法,从而为每个enum实例赋予各自不同的行为。要实现常量相关的方法,你需要为enum定义一个或多个abstract方法,然后为每个enum实例实现该抽象方法。
1)通过常量相关的方法,每个enum实例可以具备自己独特的行为,这似乎说明每个enum实例就像一个独特的类;
2)程序员可覆盖常量相关的方法;
3)枚举类型非常适合用来创建状态机。一个状态机可以具有有限个特定的状态,它通常根据输入,从一个状态转移到下一个状态,不过也可能村咋瞬时状态,而一旦任务执行接受,状态机就会立刻离开瞬时状态。

你可能感兴趣的:(java编程思想读书笔记)