2017-12-06 11 views
-1

私のenumコンストラクタで、メンバーを初期化しようとしています。どのenumが現在インスタンス化されているかを知るには、switch文を使用する必要があります。しかし何らかの理由でthisが私にはほとんど意味を持たないnullを返すようです。 thisnullはコンストラクタが完了するまでですか?もしそうなら、実行時にどのenumが構築されているのかをどのように区別することができますか?以下の例は、問題を実証するための私の実際のコードを簡略化したものです。Enumスイッチを使用するコンストラクタ(this)

Food f = Food.APPLE; 
System.out.println(f.getTastes()); 

食品列挙

public enum Food 
{ 
    APPLE, 
    PANCAKES, 
    PASTA; 

    private List<String> tastes = new ArrayList<>(); 

    Food() 
    { 
     switch(this) 
     { 
     case APPLE: 
      tastes.add("Sour"); 
      tastes.add("Sweet"); 
      break; 
     case PANCAKES: 
      tastes.add("Dough-y"); 
      break; 
     case PASTA: 
      tastes.add("Creamy"); 
      tastes.add("Rich"); 
      tastes.add("Velvet"); 
     } 
    } 

    public List<String> getTastes() 
    { 
     return tastes; 
    } 
} 

私はこれがあなたに合うだろうが、私が正しいパターンであることを信じて、代わりの場合は必ず次の例外

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at Food.<init>(Food.java:18) 
    at Food.<clinit>(Food.java:10) 
    at Tester.main(Tester.java:9) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Caused by: java.lang.NullPointerException 
    at Food.values(Food.java:8) 
    at Food$1.<clinit>(Food.java:18) 
    ... 8 more 
+5

これは、あなたの列挙型の値を区別するための非常にラウンドアバウトな方法です。これらをパラメータとしてコンストラクタに渡す必要があります。 –

+1

列挙定数を作成するには、コンストラクターを呼び出す必要があります。したがって、コンストラクタ内でenum定数が機能するとは期待できません。 – khelwood

答えて

4

I`mしない取得それぞれの食べ物がコンストラクタでどのような味をしているかを理解するだけで、それを宣言することができます。

public enum Food 
{ 
    APPLE("good", "sweet"), 
    PANCAKES("delicious","omg"), 
    PASTA("too fat", "but its gud"); 

    private List<String> tastes = new ArrayList<>(); 

     Food(String ... tastes) { 
     // add to the list 
    } 
    } 
+0

あなたは本当に別の場所にそれらの好みを追加したい場合、私はあなたのための食品の列挙体オブジェクトを構築する別のクラスを作成することをお勧めします –

+0

このメソッドを行うには、何とか1行で列挙型を初期化する必要があります。それはいつも可能ではありません(あなたが愚かなヘルパー関数を作っていない限り)。私はこれが私の質問に正確に答えないように感じる。私は正しいenumのインスタンス化を知っていますが、nullポインタの例外やこの方法での修正方法については説明していません。 – Hatefiend

+0

@Hatefiend - 重複した質問は、NPEがどこから来るのかを説明してくれることを願っています。 –

関連する問題