第37条 用EnumMap代替序数索引
Java提供了
EnumMap,在使用枚举作为key的时候可以用这种Map。底层使用了枚举的ordinal方法,本质上是Integer的Entry,所以效率会比较高-
一般创建
Map很多时候都会用Stream,Stream的默认创建Map的类型是HashMap,可以使用这种方式创建出EnumMapArrays.stream(garden) .collect(Collectors.groupingBy(e -> e.lifeCycle, () -> new EnumMap<>(LifeCycle.class), Collectors.toSet()));
思考
- 作者在书中举的例子中使用了
Map<Enum1, Map<Enum2, Enum3>的结构,我们的正常开发中是不推荐使用Map的,理由就是不能表示key和value的意义,尤其是嵌套的Map。这里使用了嵌套的理由可能是,本身枚举和String不一样,枚举已经能够表示一定的意义了 -
EnumMap本身没有太多值得看的,不过由于一般的Map构造都是通过Stream,可以让我们间接多研究下collect方法是怎么组装结果的,怎么自定义collect方法
第38条 用接口模拟可扩展的枚举
- 枚举本身是不能继承的,如果想要扩展的话可以让枚举实现接口
- 虽然无法编写可扩展的枚举类型,却可以通过编写接口以及实现该接口的基础枚举类型,对它进行模拟。这样允许客户端编写自己的枚举来实现接口。
思考
枚举实现接口看起来非常奇怪,仔细想想也是有使用的场景的,这可以适用于"一组接口的实现",比如Excel下载的时候,需要一组Vo->String的实现,这时候就可以使用这种形式。