Как я могу ссылаться на свой Java Enum, не указывая его тип


83

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

public class Test
{
    enum MyEnum{E1, E2};

    public static void aTestMethod() {
        Test2(E1);  // << Gives "E1 cannot be resolved" in eclipse.
    }
    public Test2(MyEnum e) {}
}

Если я укажу MyEnum.E1, он будет работать нормально, но мне бы очень хотелось, чтобы он был как «E1». Любая идея, как я могу это сделать, или это должно быть определено в другом файле, чтобы это работало?

ЗАКЛЮЧЕНИЕ: мне не удалось получить правильный синтаксис для импорта. Поскольку несколько ответов предполагали, что это возможно, я собираюсь выбрать тот, который дал мне синтаксис, который мне нужен, и проголосовать за других.

Между прочим, ДЕЙСТВИТЕЛЬНО СТРАННАЯ часть этого (до того, как я заставил статический импорт работать), оператор switch, который я написал, который использовал перечисление, не позволял перечислению иметь префикс по его типу - все остальное код требовал этого. Повредить мне голову.


9
Что касается «действительно странного» поведения операторов switch: Java делает это для всех перечислений в операторе switch. Поскольку вы знаете, какой тип включаете, они полагают, что нет причин заставлять вас снова указывать тип в каждом блоке case. download.oracle.com/javase/tutorial/java/javaOO/enum.html
StriplingWarrior

1
Я думаю, что меня поразило, так это то, что он не разрешил префикс типа Enum. В других местах префикс либо обязателен (если не импортирован), либо необязателен.
Bill K

Я согласен с вами в отношении switchнепоследовательности, которая заставляет менее опытных Java-программистов ломать голову.
jmarkmurphy

Ответы:


134

Фактически, вы можете выполнить статический импорт вложенного перечисления. Код ниже компилируется нормально:

package mypackage;

import static mypackage.Test.MyEnum.*;

public class Test
{
    enum MyEnum{E1, E2};

    public static void aTestMethod() {
        Test2(E1);  
    }

    public static void Test2(MyEnum e) {}
}

1
Я сослался на это как на решение своего вопроса, но я бы не стал этого делать. Перечисления используются только внутри этого одного файла. Просто кажется странным, что это не работает автоматически.
Bill K

Хотя вам необходимо использовать статический импорт, вам не нужно определять его в собственном классе.
Ишай

5
@Bill K, как вы думаете, почему он должен работать автоматически? Как бы вы тогда ожидали, что это сработает? класс A {перечисление B {X, Y}; перечисление C {X, Z}; }
Кевин Бурриллион 05

3
Это решение работает только потому, что MyEnum виден за пределами Test. Решение не сработает, если MyEnum, например, частный.
Chry Cheng

2
Не забудьте последнюю часть, символы ". *" В "import static mypackage.Test.MyEnum. *;" как и я!
joro

18

Вы можете выполнить статический импорт во вложенном классе:

import static apackage.Test.Enum.*;

6

Класс Test должен быть определен в пакете, чтобы его можно было импортировать.

С пакетом, определенным в Test( ЭТО РАБОТАЕТ ):

package mypackage;

Вы можете использовать:

import static mypackage.Test.MyEnum.*;

Без определенного пакета вы не можете использовать ( НЕ РАБОТАЕТ ):

import static Test.MyEnum.*;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.