Использование перечислений 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).
Однако, когда я это делаю, я получаю сообщение об ошибке:
не может найти символ - класс Статус
Как я могу это исправить?
Ответы
Ответ 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;
}