Вложенные перечисления в Java - PullRequest
10 голосов
/ 21 июня 2011

Я хочу вложить некоторые перечисления.Объект, который я представляю, - это Flags, с типом и значением.Существует дискретное число типов, и каждый тип имеет отдельный набор возможных значений.

Так что, если Тип 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.

Я схожу с ума, пытаясь вложить перечисления в перечисления - это то, что я пытаюсь сделать - нужно ли мне вообще отбрасывать перечисления исделать статический класс со статическими членами?

На данный момент я стараюсь:

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;

Типы несовместимы.

Ответы [ 3 ]

11 голосов
/ 21 июня 2011

Вы не можете иметь число в качестве перечисления.Это должен быть идентификатор.

Вы можете сделать это

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 голосов
/ 21 июня 2011

Вложение перечислений невозможно.Но перечисления могут реализовывать интерфейсы.Почему бы не использовать A и B как два разных перечисления, которые оба реализуют интерфейс TypedEnum с методами getType() и getValue()?

0 голосов
/ 21 июня 2011

Как я понимаю, перечисления - это своего рода синглтоны. Это означает, что перечисление X {A, B} имеет два единичных экземпляра A, B. Если у вас есть вложенное перечисление A {P, Q}, как вы можете сказать, является ли X.A X.A.P или X.A.Q? Хотел бы я сказать это проще.

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

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