了解枚举器的枚举集



据我所知,使用EnumSet要容易得多,而且Set是专门为与枚举器一起使用而设计的。我的问题是,每次需要维护一些枚举器集合时,我们是否应该考虑使用EnumSet。例如,我有以下枚举:

public enum ReportColumns{
    ID,
    NAME,
    CURRENCY
    //It may contain much more enumerators than I mentioned here
    public int getMaintenanceValue(){ 
        //impl
    }
}

我需要在方法中使用一些枚举集合:

public void persist(Collection<ReportColumns> cols){
    List<Integer> ints = new LinkedList<>();
    for(ReportColumn c: cols){
        ints.add(c.getMaintenanceValue());
    }
    //do some persistance-related operations
}

所以,如果我不关心集合是否已订购,我是否应该每次都使用EnumSet<E>来提高性能?

根据经验,每当创建枚举集合而不关心它们的顺序时,都应该创建一个EnumSet。正如您所提到的,它会使您的性能略有提高(事实上,我所知道的大多数静态代码分析工具实际上都警告不要使用它(。

不过,对于声明的方法,我不会这么做。作为另一条经验法则,方法应该尽可能使用仍然有意义的"最高"类型。这种方法的公共契约应该是"给我一堆枚举,我会坚持它们"。该方法不应该关心传递了什么集合,因此强制参数类型为EnumSet是没有意义的。如果您传递的具体类型确实是EnumSet,那么您将获得所有性能优势。

最新更新