各定数は、独自の列挙型クラスの単一のサブクラスであるため、列挙型がマルチトン (つまり、コンパイル時に認識される固定数のインスタンスを持つクラス) を実行するための優れた方法であることは誰もが知っています。ただし、列挙定数固有の初期化を行う方法の問題に遭遇しました。
次の列挙型があるとします。
public enum InputMethod {
FOO {
private final FooFactory factory;
public Document createDocument(String inputString) {
return factory.createFooParser().parse(inputString);
}
},
BAR {
public Document createDocument(String inputString) {
BarBuilder builder = new BarBuilder();
builder.setInput(inputString);
return input.build();
}
};
public abstract Document createDocument(String inputString);
}
私がしたいのは、FooFactory
インスタンスを初期化することですInputMethod.FOO
。そのためには、たとえばFooFactory.newInstance()
. ただし、これは例外をスローする可能性があるため、簡単に言うことはできませんfactory = FooFactory.newInstance()
。InputMethod.BAR
FooFactory をまったく使用しないため、これを列挙型のコンストラクターに入れることはできません。列挙型定数自体の初期化に対して静的初期化が行われる順序が原因で、静的初期化を使用しても機能しないようです。最後に、コンストラクターを明示的に宣言することはできません。これは、コンストラクターのインスタンスであるサブクラスがInputMethod
たまたまFOO
匿名であるためです。
では、遅延初期化に自分自身を辞任する以外に、FooFactory
インスタンスを適切に初期化するにはどうすればよいでしょうInputMethod.FOO
か?