Подтвердить что ты не робот

Использование перечислений Java из разных классов?

Если бы у меня был класс в Java, например:

public class Test
{
    // ...
    public enum Status {
        Opened,
        Closed,
        Waiting
    }
    // ...
}

И у меня был другой класс в другом файле класса (но в том же проекте/папке):

public class UsingEnums
{
    public static void Main(String[] args)
    {
        Test test = new Test(); // new Test object (storing enum)

        switch(test.getStatus()) // returns the current status
        {
            case Status.Opened:
                // do something
            // break and other cases
        }
    }
}

Я бы действительно имел перечисление в одном классе, которое используется в другом классе (в моем случае, в частности, в операторе switch-case).

Однако, когда я это делаю, я получаю сообщение об ошибке:

не может найти символ - класс Статус

Как я могу это исправить?

4b9b3361

Ответ 1

Метка ключа перечислимого типа должна быть неквалифицированным именем константы перечисления:

switch (test.getStatus()) // returns the current status
{
    case Opened:
        // do something
        // break and other cases
}

Не имеет значения, что он определен в другом классе. В любом случае компилятор может вывести тип перечисления на основе вашего оператора switch и не нуждается в именах констант, которые должны быть квалифицированы. По какой-либо причине использование квалифицированных имен является недопустимым синтаксисом.

Это требование указано JLS §14.11:

SwitchLabel:
   case ConstantExpression :
   case EnumConstantName :
   default :

EnumConstantName:
   Identifier

(Спасибо за сообщение от Mark Peters для справки.)

Ответ 2

Если ваш getStatus() возвращает фактически Status, ваш случай должен быть:

case Opened:

Если вы попытаетесь:

case Test.Status.Opened:

ваша IDE выдаст вам ошибку, например:

an enum switch case label must be the unqualified name of an enumeration constant

Ответ 3

NVM

Он должен быть полностью неквалифицирован, квалификация задается типом переменной switch() ed (в данном случае test.getStatus(), которая является Test.Status).


Ваш Enum Status является частью вашего class Test. Таким образом, вам необходимо квалифицировать его:

    Test test = new Test(); // new Test object (storing enum)

    switch(test.getStatus()) // returns the current status
    {
        case Test.Status.Opened:
            // do something
        // break and other cases
    }

Забастовкa >

Ответ 4

Поскольку перечисление Status заключено в класс Test, вам нужно использовать Test.Status вместо Status.

Ответ 5

Перечисления (более или менее) - это просто классы, как и любые другие, поэтому правила здесь такие же, как и для других внутренних классов. Здесь вы, вероятно, хотели объявить класс enum как static: он не зависит от членов его охватывающего класса. В этом случае Test.Status.Opened будет правильным способом ссылаться на него. Если вы действительно не имеете в виду, что класс статичен, вам, вероятно, нужно будет использовать экземпляр как "определитель пространства имен", т.е. Test.Status.Opened.

Изменить: Очевидно, перечисления неявно статичны. Это имеет смысл, учитывая, что должно быть enum, но это, вероятно, хорошая форма, чтобы объявить их как статические явно.

Ответ 6

Я объявил enum в своем классе следующим образом:

открытый класс MyBinaryTree {

private Node root;
public enum ORDER_TYPE {
    IN_ORDER, POST_ORDER,
};

    public void printTree(ORDER_TYPE order) {
    //Printing tree here
    }

}

и я пытался получить доступ к этому в другом классе

public class Solution1 {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    MyBinaryTree myTree = new MyBinaryTree();
            myTree.printTree(myTree.ORDER_TYPE.POST_ORDER);
   }

}

Проблема в том, что если я использую экземплярный объект для доступа к перечислению ORDER_TYPE, я получаю ошибку времени компиляции: " ORDER_TYPE не может быть разрешен или не является полем"

Я снова проверил и изменил свой код, чтобы напрямую использовать имя класса в качестве классификатора имен

public static void main(String[] args) {
 MyBinaryTree myTree = new MyBinaryTree();
 myTree.printTree(MyBinaryTree.ORDER_TYPE.POST_ORDER);
}

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

Ответ 7

Попробуйте в этом примере

switch(test.getStatus()) {

     case FILE : 
            fullList.addAll(getFileMensionList(session, search, authUser));
            break;
     case EVENT :
            fullList.addAll(getEventMensionList(session, search, authUser));
            break;
     case POLL :
            fullList.addAll(getPollMensionList(session, search, authUser));
            break;
     case PROJECT :
            fullList.addAll(getProjectMensionList(session, search, authUser));
            break;
     case TASK :
            fullList.addAll(getTaskMensionList(session, search, authUser));
            break;
}