第37条 用EnumMap代替序数索引
-
Java提供了
EnumMap
,在使用枚举作为key的时候可以用这种Map
。底层使用了枚举的ordinal
方法,本质上是Integer
的Entry
,所以效率会比较高 -
一般创建
Map
很多时候都会用Stream
,Stream
的默认创建Map
的类型是HashMap
,可以使用这种方式创建出EnumMap
Arrays.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的实现,这时候就可以使用这种形式。
网友评论