Понимание 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 2

1 ответ:

Как правило, всякий раз, когда вы создаете коллекцию перечислений и не заботитесь об их порядке, вы должны создать EnumSet. Как вы уже упоминали, это даст вам небольшое увеличение производительности (на самом деле, большинство инструментов статического анализа кода, которые я знаю, предупреждают о том, чтобы не использовать его).

Для метода объявление хотя, я бы не стал. как еще одно эмпирическое правило, методы должны использовать "самый высокий" возможный тип, который все еще имеет смысл. Публичный договор по данному методу должен будьте "дайте мне кучу перечислений, и я буду настаивать на них". Метод не должен заботиться о том, какая коллекция передается, поэтому нет смысла заставлять тип параметра быть EnumSet. Если конкретный тип, который вы проходите, действительно EnumSet ,вы все равно получите все преимущества производительности.