Як я можу посилатися на свій 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. Оскільки ви знаєте, який тип ви вмикаєте, вони вважають, що немає причин змушувати вас вказувати тип знову в кожному блоці справи. 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
Я натякнув на це як на рішення у своєму питанні, але справді волів би не робити цього. Переліки використовуються лише всередині цього одного файлу. Просто здається дивним, що це не просто працює автоматично.
Білл К

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

5
@Bill K, чому, на вашу думку, це повинно працювати автоматично? Як би ви очікували, що це спрацює тоді? клас A {перелік B {X, Y}; перелічити C {X, Z}; }
Кевін Бурріллін, 05

2
Це рішення працює лише тому, що MyEnum видно поза тестом. Рішення не буде працювати, якщо MyEnum є, наприклад, приватним.
Chry Cheng

2
Не забудьте останню частину, символи ". *" У "імпорту статичного mypackage.Test.MyEnum. *;" як я це зробив!
joro

17

Ви можете зробити статичний імпорт вкладеного класу:

import static apackage.Test.Enum.*;

6

Клас випробувань повинен бути визначений у пакеті, щоб його можна було імпортувати.

З пакетом, визначеним у Test( ІТ ПРАЦЮЄ ):

package mypackage;

Ви можете використовувати:

import static mypackage.Test.MyEnum.*;

Без визначеного пакету ви не можете використовувати ( НЕ РОБОТИ ):

import static Test.MyEnum.*;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.