Java: получение массива элементов ENUM - PullRequest
6 голосов
/ 28 мая 2011

Есть ли лучший способ создания массивов из элементов перечисления:

    public static enum LOGICAL {
        AND ("&", "AND"),
        OR ("||", "OR");

        public final String symbol;
        public final String label;

        LOGICAL(String symbol, String label) {
            this.symbol=symbol;
            this.label=label;
        }
    }

    public static final String[] LOGICAL_NAMES = new String[LOGICAL.values().length];
    static{
        for(int i=0; i<LOGICAL.values().length; i++)
            LOGICAL_NAMES[i]=LOGICAL.values()[i].symbol;
    }

    public static final String[] LOGICAL_LABELS = new String[LOGICAL.values().length];
    static{
        for(int i=0; i<LOGICAL.values().length; i++)
            LOGICAL_LABELS[i]=LOGICAL.values()[i].label;
    }

Ответы [ 3 ]

3 голосов
/ 28 мая 2011

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

private static final List<String> labels;
private static final List<String> values;

static
{
    List<String> mutableLabels = new ArrayList<String>();
    List<String> mutableValues = new ArrayList<String>();
    for (LOGICAL x : LOGICAL.values())
    {
         mutableLabels.add(x.label);
         mutableValues.add(x.value);
    }
    labels = Collections.unmodifiableList(mutableLabels);
    values = Collections.unmodifiableList(mutableValues);
}

(Если вы уже используете Guava , вы можете даже использовать вместо нее ImmutableList и выставлять коллекции таким образом, чтобы сделатьясно, что они неизменны.)

2 голосов
/ 28 мая 2011

Если вы используете свои значения очень часто и ваше перечисление увеличивается, используйте Карты. Объявите в своем классе следующее.

private static EnumMap<LOGICAL,String> symbols = new EnumMap<LOGICAL, String>(LOGICAL.class);

, а затем чуть ниже:

static{
    for(LOGICAL i : LOGICAL.values().)
        symbols.put(i, i.symbol);
}

тогда вы можете использовать symbols.values() или symbols.get(LOGICAL.AND) и т. Д.

2 голосов
/ 28 мая 2011

Нет.Это кажется правильным способом.Даже если бы была какая-то утилита, она бы полагалась на отражение

Если вы используете ее часто, кешируйте ее в enum

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...