Effective Java - 用接口模拟可扩展的枚举

2022-07-03  本文已影响0人  DZQANN

第37条 用EnumMap代替序数索引

  1. Java提供了EnumMap,在使用枚举作为key的时候可以用这种Map。底层使用了枚举的ordinal方法,本质上是IntegerEntry,所以效率会比较高

  2. 一般创建Map很多时候都会用StreamStream的默认创建Map的类型是HashMap,可以使用这种方式创建出EnumMap

    Arrays.stream(garden)
        .collect(Collectors.groupingBy(e -> e.lifeCycle, () -> new EnumMap<>(LifeCycle.class), Collectors.toSet()));
    

思考

  1. 作者在书中举的例子中使用了Map<Enum1, Map<Enum2, Enum3>的结构,我们的正常开发中是不推荐使用Map的,理由就是不能表示key和value的意义,尤其是嵌套的Map。这里使用了嵌套的理由可能是,本身枚举和String不一样,枚举已经能够表示一定的意义了
  2. EnumMap本身没有太多值得看的,不过由于一般的Map构造都是通过Stream,可以让我们间接多研究下collect方法是怎么组装结果的,怎么自定义collect方法

第38条 用接口模拟可扩展的枚举

  1. 枚举本身是不能继承的,如果想要扩展的话可以让枚举实现接口
  2. 虽然无法编写可扩展的枚举类型,却可以通过编写接口以及实现该接口的基础枚举类型,对它进行模拟。这样允许客户端编写自己的枚举来实现接口。

思考

枚举实现接口看起来非常奇怪,仔细想想也是有使用的场景的,这可以适用于"一组接口的实现",比如Excel下载的时候,需要一组Vo->String的实现,这时候就可以使用这种形式。

上一篇下一篇

猜你喜欢

热点阅读