タイプを指定せずにJava列挙型を参照するにはどうすればよいですか?


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 2011

1
私が得たのは、列挙型のプレフィックスを許可しないということだと思います。それ以外の場合は、プレフィックスが必須(インポートされていない場合)またはオプションです。
ビルK

私はswitch矛盾に関してあなたに同意し、経験の浅いJavaプログラマーに頭を悩ませます。
jmarkmurphy 2015

回答:


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
私は私の質問の解決策としてこれをほのめかしました、しかし私は本当にそれをしたくありません。列挙型は、この1つのファイル内でのみ使用されます。これが自動的に機能しないのは奇妙に思えます。
ビルK

静的インポートを使用する必要がありますが、独自のクラスで定義する必要はありません。
Yishai

5
@Bill K、なぜ自動的に機能するはずだと思いますか?では、これがどのように機能すると思いますか?クラスA {列挙型B {X、Y}; 列挙型C {X、Z}; }
Kevin Bourrillion 2009年

2
このソリューションは、MyEnumがTestの外部に表示されるためにのみ機能します。MyEnumがプライベートなどの場合、ソリューションは機能しません。
Chry Cheng 2013

2
最後の部分である「importstaticmypackage.Test.MyEnum。*;」の記号「。*」を忘れないでください。私がしたように!
joro 2016年

17

ネストされたクラスで静的インポートを実行できます。

import static apackage.Test.Enum.*;

6

Testクラスをインポートするには、パッケージで定義する必要があります。

TestIT WORKS)で定義されたパッケージの場合:

package mypackage;

次を使用できます。

import static mypackage.Test.MyEnum.*;

パッケージが定義されていないと、使用できません(機能しません):

import static Test.MyEnum.*;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.