Почему я получаю ссылку на константу Enum, которая не может быть указана в метке регистра? - PullRequest
41 голосов
/ 19 апреля 2010

Почему следующий код не компилируется при изменении оператора case на

case ENUM1: doSomeStuff();

работает

public enum EnumType
{
    ENUM1, ENUM2, ENUM3;

    void doSomeStuff()
    {
        switch(this)
        {
        case EnumType.ENUM1: doSomeStuff();
        }
    }
}

Ответы [ 3 ]

34 голосов
/ 19 апреля 2010

Это позволяет избежать возможности сравнения с различными типами перечислений. Имеет смысл ограничить его типом one , то есть типом значения enum в операторе switch.

Обновление : это на самом деле сохранить двоичную совместимость. Вот цитата из примерно половины главы 13.4.9 из JLS:

Одна из причин, по которой требуется встраивание констант, заключается в том, что в операторах switch требуются константы для каждого case, и никакие два таких постоянных значения не могут быть одинаковыми. Компилятор проверяет дубликаты постоянных значений в операторе switch во время компиляции; формат файла class не выполняет символическую привязку значений регистра.

Другими словами, из-за идентификатора класса в EnumType.ENUM1 он не может быть представлен как константное выражение времени компиляции, хотя это требуется оператором switch.

29 голосов
/ 19 апреля 2010

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

public enum EnumType {
    ENUM1 {
        @Override
        public void doSomeStuff() {
            // do something
        }
    },
    ENUM2 {
        @Override
        public void doSomeStuff() {
            // do something else
        }
    };

    public abstract void doSomeStuff();
}
20 голосов
/ 19 апреля 2010

Поскольку вы включаете объект типа EnumType и единственными возможными значениями для него являются константы перечисления, нет необходимости снова определять эти константы внутри коммутатора. В конце концов, в любом случае было бы незаконно иметь case OtherEnumType.ENUM1:.

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