Понимание 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>
каждый раз, чтобы улучшить производительность?
1 ответ:
Как правило, всякий раз, когда вы создаете коллекцию перечислений и не заботитесь об их порядке, вы должны создать
EnumSet
. Как вы уже упоминали, это даст вам небольшое увеличение производительности (на самом деле, большинство инструментов статического анализа кода, которые я знаю, предупреждают о том, чтобы не использовать его).Для метода объявление хотя, я бы не стал. как еще одно эмпирическое правило, методы должны использовать "самый высокий" возможный тип, который все еще имеет смысл. Публичный договор по данному методу должен будьте "дайте мне кучу перечислений, и я буду настаивать на них". Метод не должен заботиться о том, какая коллекция передается, поэтому нет смысла заставлять тип параметра быть
EnumSet
. Если конкретный тип, который вы проходите, действительноEnumSet
,вы все равно получите все преимущества производительности.