Установка значений перечислений и разбора строки для получения перечисления - PullRequest
5 голосов
/ 05 декабря 2011

Мое перечисление сейчас выглядит следующим образом:

public enum Manufacturers {
  Honda,
  GM,
  Toyota,
  Ferrari
}

Мне нужно создать Hashmap, поэтому я планирую сделать это, верно?

Manufacturers mfg = Manufacturers.Honda;

mfg.ordinal()  // save as key

т.е. я буду хранитьключ, используя enumInstance.ordinal()

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

Manufacturers mfg = Manufacturers.valueOf(mfgOrdinalValueAsString);

Вышедал мне ошибку (строка была "1").Это правильный путь?Я полагаю, у меня должна быть попытка / ловить, верно?

Ответы [ 2 ]

2 голосов
/ 05 декабря 2011

Предложение: лучше использовать name(), чтобы получить имя перечисления как String, и всякий раз, когда вам нужно вернуть исходный Enum из него, используйте valueOf()метод - поскольку valueOf() ожидает в качестве параметра имя , а не порядковый номер.Например:

enum Example {ONE, TWO};

String name = Example.ONE.name();
Example e = Example.valueOf(Example.class, name);  // e has value ONE

Если вам определенно необходимо использовать порядковый номер, метод ordinal() вернет индекс, который можно использовать для извлечения соответствующего Enum из массива, возвращенного values()метод.Как это:

int ordinal = Example.ONE.ordinal();
Example e = Example.values()[ordinal];  // e has value ONE

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

СпециализированныйРеализация карты для использования с ключами типа enum.Все ключи в карте перечисления должны происходить из единственного типа перечисления, который указывается, явно или неявно, при создании карты.Enum карты представлены внутри как массивы.Это представление чрезвычайно компактно и эффективно.

РЕДАКТИРОВАТЬ

Если вам нужно связать разные коды для каждого элемента перечисления (кроме его автоматически назначенного)порядковый номер), вы всегда можете добавить его в качестве атрибута в перечисление вместе с геттерами и сеттерами, например:

public enum Manufacturers {

    Honda(10),
    GM(20),
    Toyota(30),
    Ferrari(40);

    private int code;

    Manufacturers(int code) {
        this.code = code;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

}

Например:

Manufacturers m = Manufacturers.Honda;
System.out.println(m.getCode()); // prints 10
m.setCode(100);
System.out.println(m.getCode()); // prints 100

Просто знайте, что выне сможет восстановить объект Enum из атрибута code, так как это было определено программистом.

2 голосов
/ 05 декабря 2011

.valueOf на самом деле ожидал бы строку "GM" (для 1).

Что касается хранения значений перечисления на карте, используйте EnumMap, который предназначен специально для этого - и будетБыть быстрым в этом тоже.

Если вы действительно хотите ссылаться на значение по порядковому номеру, используйте что-то вроде Manufacturers.values()[1].

...