了解枚举器的枚举集
Understanding enumset for enumerators
据我所知,使用 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
。正如您提到的,它会给您带来轻微的性能提升(事实上,我知道的大多数静态代码分析工具实际上都会警告不要使用它)。
虽然对于方法声明,我不会。作为另一个经验法则,方法应该尽可能使用仍然有意义的 "highest" 类型。此方法的 public 约定应为 "give me a bunch of enums, and I'll persist them"。该方法不应该关心传递的是什么集合,因此强制参数类型为 EnumSet
是没有意义的。如果您传递的具体类型确实是 EnumSet
,您将获得所有性能优势。
据我所知,使用 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
。正如您提到的,它会给您带来轻微的性能提升(事实上,我知道的大多数静态代码分析工具实际上都会警告不要使用它)。
虽然对于方法声明,我不会。作为另一个经验法则,方法应该尽可能使用仍然有意义的 "highest" 类型。此方法的 public 约定应为 "give me a bunch of enums, and I'll persist them"。该方法不应该关心传递的是什么集合,因此强制参数类型为 EnumSet
是没有意义的。如果您传递的具体类型确实是 EnumSet
,您将获得所有性能优势。