Вложенные перечисления в Java
Я хочу вложить некоторые перечисления. Объект, который я представляю, - это флаги с типом и значением. Существует дискретное число типов, и каждый тип имеет различный набор возможных значений.
Итак, если тип A может иметь значения 1, 2 или 3, а тип B может иметь значения 4,5,6, я хотел бы иметь возможность делать такие вещи, как:
Flag f = Flag.A.1;
f.getType() - returns "A"
f.getValue() - returns "1"
Flag f2 = Flag.A.4; -- Syntax error.
Я с ума сошел, пытаясь вложить enums в enums - это то, что я пытаюсь сделать - мне нужно полностью перерезать enums и вручную статический класс со статическими членами?
Мое лучшее усилие до сих пор:
public class Flag {
enum A extends Flag {
ONE("ONE"),
TWO("TWO"),
THREE("THREE");
private A(String value) {
Flag.type = "A";
Flag.value = value;
}
}
private static String type;
private static String value;
}
Но если я это сделаю:
Flag f = Flag.A.ONE;
Типы несовместимы.
Ответы
Ответ 1
Вы не можете иметь число как перечисление. Он должен быть идентификатором.
Вы можете сделать это
interface Flag {
String getType();
int getValue();
enum A implements Flag{
one, two, three;
String getType() { return getClass().getSimpleName(); }
int getvalue() { return ordinal()+1; }
}
enum B implements Flag{
four, five, six;
String getType() { return getClass().getSimpleName(); }
int getvalue() { return ordinal()+4; }
}
}
Flag f = Flag.A.one;
Однако более простой вариант может быть
enum Flag {
A1, A2, A3, B4, B5, B6;
public String getType() { return name().substring(0,1); }
public int getValue() { return name().charAt(1) - '0'; }
}
Flag f = Flag.A1;
Ответ 2
Вложенные перечисления невозможны. Но перечисления могут реализовывать интерфейсы. Почему бы не иметь A
и B
как два разных перечисления, которые реализуют интерфейс TypedEnum
с методами getType()
и getValue()
?
Ответ 3
Как я понимаю перечисления, они являются разновидностями однополых. Это означает, что перечисление X {A, B} имеет два одноэлементных экземпляра A, B. Если у вас было вложенное перечисление A {P, Q}, как вы можете сказать, является ли X.A X.A.P или X.A.Q? Хотел бы я сказать проще.
Использовать статический класс.