Вложенные перечисления в 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? Хотел бы я сказать проще.

Использовать статический класс.