私のenumコンストラクタで、メンバーを初期化しようとしています。どのenumが現在インスタンス化されているかを知るには、switch文を使用する必要があります。しかし何らかの理由でthis
が私にはほとんど意味を持たないnull
を返すようです。 this
null
はコンストラクタが完了するまでですか?もしそうなら、実行時にどの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
これは、あなたの列挙型の値を区別するための非常にラウンドアバウトな方法です。これらをパラメータとしてコンストラクタに渡す必要があります。 –
列挙定数を作成するには、コンストラクターを呼び出す必要があります。したがって、コンストラクタ内でenum定数が機能するとは期待できません。 – khelwood