2016-03-08 17 views
5

セイをインポートしません。スイッチは、次のように私は列挙型を持つクラス

package stackoverflow.classes; 

import stackoverflow.models.MyPojo; 

public class MyClass { 
    public static void main(final String... args) { 
     final MyPojo pojo = new MyPojo(); 
     switch(pojo.getMyEnum()) { 
     case VALUE_1: 
      break; 
     case VALUE_2: 
      break; 
     default: 
      break; 
     } 
    } 
} 
:私は MyPojo.getMyEnum()switchを行う必要があり、私は直接私のクラスに列挙型をインポートする ない必要性を行います210

これはなぜ私が不思議に思っていたのですか? Enumを直接インポートしない場合、JavaはEnum値をどのように解決しますか?

+1

まあ、それは 'MyPojo'クラスで使用されているので間接的にenumをインポートします(両方が同じパッケージにあるためにインポートが不要です)。 – Thomas

+0

この場合、Enumは別のクラス(MyPojo)の内部で定義され、静的内部クラスのように動作します。だからあなたの質問に答えています:あなたがあなたのクラスをインポートするとき、あなたはまた、すべての内部クラスと列挙をインポートしました。列挙型が別のファイルで定義されている場合は、明示的にインポートするか、完全修飾名(org.mynamespace.MyEnumなど)を使用する必要があります。 – DoubleM

+0

@Thomas以前は間接インポートについて聞いたことがありません。詳しく教える? –

答えて

5

それだないで述べたようにスコープは、switch文のcaseラベルを含める列挙型そのものではなく、enum定数、:

宣言の範囲は、プログラムの領域であり、その宣言によって宣言されたエンティティは、可視であれば(§6.4.1)、単純な名前で参照することができます。

...

定数Cは、列挙型Tで宣言された列挙の範囲は、Tの本体、および発現列挙型T(§14.11)であるswitchステートメントのいずれの場合もラベルです。

+0

興味深い、ちょうど必要な "単純な名前"。リンクありがとう。 –

+0

単純名は単に列挙定数の名前です。ここでの重要な概念は、この定数の宣言の範囲です。 – manouti

関連する問題