提示三十七: 使用 EnumMap 替代序数索引。
ordinal属性是Enum类的私有属性,每个枚举常量类型都会在初始化的时候根据它在枚举类中的数值位置被赋上值。但是由于难以维护,所以一般都不太推荐使用。书中一开始先用ordinal 方法来索引到数组或列表位置,然后推荐了更好用的EnumMap的方法,它解决了数组兼容泛型等一系列问题。
// Using ordinal() to index into an array - DON'T DO THIS!
Set<Plant>[] plantsByLifeCycle = (Set<Plant>[]) new Set[Plant.LifeCycle.values().length];
for (int i = 0; i < plantsByLifeCycle.length; i++) {
plantsByLifeCycle[i] = new HashSet<>();
}
for (Plant p : garden) {
plantsByLifeCycle[p.lifeCycle.ordinal()].add(p);
}
// Using an EnumMap to associate data with an enum
Map<Plant.LifeCycle, Set<Plant>> plantsByLifeCycle = new EnumMap<>(Plant.LifeCycle.class);
for (Plant.LifeCycle lc : Plant.LifeCycle.values()) {
plantsByLifeCycle.put(lc, new HashSet<>());
}
for (Plant p : garden) {
plantsByLifeCycle.get(p.lifeCycle).add(p);
}
接着作者还介绍了stream的方式来实现,而且更加优雅。但外观也可能是骗人的,我们需要掌握内部实现的细节。
看作者的代码我就发现stream里面的toMap方法原来可以有4个参数,一般我习惯只是用前面两个参数,map好key和value的值就行,还记得有次就因为我没有使用第三个参数来处理key冲突的问题导致QA报错,但是第四个参数我真的是没有接触过。以后学习代码还是需要多看源码,才能更好的掌握。
网友评论