Перечисление значений ().длина против частного поля


у меня есть перечисление вот так:

public enum Configuration {
    XML(1),
    XSLT(10),
    TXT(100),
    HTML(2),
    DB(20);

    private final int id;
    private Configuration(int id) {
        this.id = id;
    }
    public int getId() { return id; }
}

иногда мне нужно проверить, сколько полей у меня в перечисление. Что является лучшим решением? Я должен использовать метод " values ().длина"? Или, может быть, я должен создать постоянное поле в перечислении следующим образом:

public enum Configuration {
    XML(1),
    XSLT(10),
    TXT(100),
    HTML(2),
    DB(20);

    private final int id;
    private Configuration(int id) {
        this.id = id;
    }
    public int getId() { return id; }

    public static final int Size = 5;
}

что самое быстрое и более элегантное решение?

4   51   2009-11-16 14:49:38

4 ответа:

используя values().length создаст новую копию массива каждый раз, когда вы называете его. Я иногда создаю свой собственный List (или установить, или карта, все, что мне нужно), чтобы избежать этого бессмысленного копирования. Я не жесткий-код, хотя он... если вам нужен только размер, я бы просто использовать:

private static final int size = Configuration.values().length;

в конце. К моменту оценки все значения будут инициализированы. Это позволяет избежать сухих и противоречивых проблем, поднятых в других ответах.

конечно, это это немного микро-оптимизация сама по себе... но тот, который заканчивается проще код в конце концов, ИМО. Звоню values().length из другого места не выражает то, что вас интересует, а именно просто размер перечисления-тот факт, что вы получаете его через массив значений, является случайным и отвлекающим, ИМО.

альтернатива использованию values() использовать EnumSet.allOf().size() что для небольших перечислений будет довольно дешево - но опять же, это не так читаемо, как просто имея

Я бы рекомендовал использовать values().length. Это гораздо более элегантно, и накладные расходы на производительность по сравнению с использованием константы будут незначительными. Кроме того, вы исключаете риск того, что константа когда-либо станет не в ногу с фактической длиной перечисления.

сохраняя количество вы нарушаете сухой принцип, Так что если у вас нет очень веской причины, вы не должны.

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

public enum Colors {
    BLUE, GREEN, FUCHSIA;
    public static int COUNT = Colors.values().length;
}

таким образом, Вы автоматически обновляете константу и по-прежнему избегаете накладных расходов "values ()".