(33):用EnumMap代替序数索引

    xiaoxiao2021-04-17  34

    当我们需要使用Map类型,且Map的key可以被做成枚举类型,我们应该考虑使用EnumMap。

    现在有这么一个问题,有一座花园,里面有很多花。花总共有三种类型,我们想把它分类分出来。

    public class Herb { public enum Type { ANNUAL, PERENNTAL, BIENNIAL } // private static final Herb Type = null; private final String name; private final Type type; Herb(String name, Type type) { this.name = name; this.type = type; } @Override public String toString() { return name; } // 将集合放到一个按照类型的序数进行索引的数组中来实现 替换 Herb[] garden = { new Herb("1", Type.ANNUAL), new Herb("2", Type.BIENNIAL), new Herb("3", Type.PERENNTAL) }; Set<Herb>[] herbsByType = (Set<Herb>[])new Set[Herb.Type.values().length]; for(int i = 0;i<herbsByType.length;i++){ herbsByType[i] = new HashSet<Herb>(); } for(Herb h:garden){ herbsByType[h.type.ordinal()].add(h); } }}数组不能与泛型兼容 , 程序需要进行未受检转换 .因为数组不知道他的索引代表什么 , 你必须手工标注这些索引的输出 . 当你这么做时 , 访问一个按照枚举的序数进行索引的数组时 , 使用正确的 int 值就是你的指责了; 而在这个程序中使用 int 值是不安全的. 

    Herb[] garden = { new Herb("1", Type.ANNUAL), new Herb("2", Type.BIENNIAL), new Herb("3", Type.PERENNTAL) }; Map<Herb.Type, Set<Herb>> herbsByType = new EnumMap<Herb.Type,Set<Herb>>(Herb.Type.class); for(Herb.Type t:Herb.Type.values()){ herbsByType.put(t, new HashSet<Herb>()); } for(Herb h:garden) herbsByType.get(h.type).add(h); System.out.println(herbsByType);总而言之 最好不要用序数来索引数组 . 如果你所表示的这种关系是多维的 , 就使用 EnumMap<…,EnumMap<…>> . 应用程序的程序员在一般情况下都不使用 Enum.ordinal , 即使要用也是因为特殊情况 .

    转载请注明原文地址: https://ju.6miu.com/read-673303.html

    最新回复(0)