Для этого сценария похоже, что вы можете просто использовать поле экземпляра .
public enum Direction {
NORTH(0x10), WEST(0x18), ...;
private final int code;
Direction(int code) { this.code = code; }
public int getCode() { return code; }
}
Java enum
реализованы как объекты. У них могут быть поля и методы. У вас также есть возможность объявить конструктор, который принимает некоторые аргументы, и предоставить значения для этих аргументов в вашем постоянном объявлении. Вы можете использовать эти значения для инициализации любых объявленных полей.
Смотри также
Приложение: EnumSet
и EnumMap
Обратите внимание, что в зависимости от того, что это за значения, у вас может быть даже лучшая опция, чем у полей экземпляра. То есть, если вы пытаетесь установить значения для битовых полей, вы должны просто использовать EnumSet
.
Обычно можно видеть степени двух констант, скажем, в C ++, которые будут использоваться вместе с побитовыми операциями как компактное представление набора.
// "before" implementation, with bitwise operations
public static final int BUTTON_A = 0x01;
public static final int BUTTON_B = 0x02;
public static final int BUTTON_X = 0x04;
public static final int BUTTON_Y = 0x08;
int buttonState = BUTTON_A | BUTTON_X; // A & X are pressed!
if ((buttonState & BUTTON_B) != 0) ... // B is pressed...
С enum
и EnumSet
это может выглядеть примерно так:
// "after" implementation, with enum and EnumSet
enum Button { A, B, X, Y; }
Set<Button> buttonState = EnumSet.of(Button.A, Button.X); // A & X are pressed!
if (buttonState.contains(Button.B)) ... // B is pressed...
Существует также EnumMap
, который вы можете использовать. Это Map
с ключами enum
констант.
Итак, где, как и раньше, у вас может быть что-то подобное:
// "before", with int constants and array indexing
public static final int JANUARY = 0; ...
Employee[] employeeOfTheMonth = ...
employeeOfTheMonth[JANUARY] = jamesBond;
Теперь вы можете иметь:
// "after", with enum and EnumMap
enum Month { JANUARY, ... }
Map<Month, Employee> employeeOfTheMonth = ...
employeeOfTheMonth.put(Month.JANUARY, jamesBond);
В Java enum
- очень мощная абстракция, которая также хорошо работает с Java Collections Framework.
Смотри также
- Учебники по Java / Структура коллекций
- Effective Java 2nd Edition
- Элемент 30: используйте
enum
вместо int
констант
- Элемент 31: Использовать поля экземпляра вместо ординалов
- Элемент 32: использовать
EnumSet
вместо битовых полей
- Элемент 33: используйте
EnumMap
вместо порядкового индекса
Похожие вопросы