Почему ссылочные переменные перечисления не могут быть объявлены вне метода самостоятельно? - PullRequest
1 голос
/ 04 мая 2020

Меня смущают правила, когда речь заходит о создании ссылочных переменных для типов перечислений.

ВНЕ ОСНОВНОЙ МЕТОД:

[A] Когда я создаю ссылку Переменная для перечисления сама по себе, я встретил с синтаксической ошибкой. Однако [B] Когда я присоединяю эту ссылочную переменную к константе перечисления, это как-то нормально.

Эта ситуация еще более усложняется, когда я экспериментирую с помещением [A] и [B] внутри основного метода - как [X] и [Y].

ВНУТРИ ГЛАВНОГО МЕТОДА:

ОБА [X] и [Y] в порядке. Я могу создать справочную переменную [X] точно так же, как в [A], но без ошибок.

Поэтому я думаю, что источник проблемы в том, что [A] находится вне основного метода, но [X] находится внутри метода.

Я могу создать ссылочную переменную для перечисления внутри метода, но выполнение за ее пределами приведет к синтаксической ошибке. Кто-нибудь знает, почему это так? Большое спасибо.

enum Transport {
    CAR, TRUCK, AIRPLANE, TRAIN, BOAT
}

public class EnumDemo {

    Transport tp; // <A> - syntax error on ';'
    tp = Transport.AIRPLANE;
    Transport tb = Transport.AIRPLANE; // <B>

    public static void main(String[] args) {
        Transport tp; // <X> but this is fine.
        tp = Transport.AIRPLANE;
        Transport tb = Transport.AIRPLANE; // <Y>
    }
}

1 Ответ

3 голосов
/ 04 мая 2020

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

Это будет работать:

public class EnumDemo {

    Transport tp; // <A> - syntax error on ';'
    {
        tp = Transport.AIRPLANE;
    }
    //...

{} вокруг tp = называется инициализатором экземпляра ; они относительно редки и несколько сбивают с толку, поэтому вы должны предпочесть присваивание непосредственно в поле (возможно, определение метода для инкапсуляции необходимых логических элементов c) или в конструкторе.

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