次のようなものを実装するためのより良いパターンを探しています:
public static enum Foo {
VAL1( new Bar() ),
VAL2( new FooBar() );
private final bar;
private Foo( IBar bar ) {
this.bar = bar;
}
public IBar getBar() { return bar; }
}
enum問題は、原因の副作用にアクセスすることです。DBBar接続などを開きます。そのため、必要なだけでも、VAL2セットアップの代償を払わなければなりませんVAL1。
OTOH、 の値barは に密接に結合されていenumます。これは静的属性に似ていますがenum、遅延初期化はありません。抽象化して匿名クラスを使用することもできFoo.getBar()ますが、その場合、毎回セットアップ料金を支払う必要があります。
s の属性に遅延初期化を追加する安価な方法はありenumますか?
[編集]これを明確にするために:
getBar()何百万回も呼ばれています。目がくらむほど速いに違いない。ここではシングルトンについて話しています (
enumそれ自体と同じように)。単一のインスタンスのみを作成する必要があります。追加のポイントとして、単体テストはこの動作をオーバーライドできる必要があります。
インスタンスは遅延して作成する必要があります。
Spring で値を Bean として登録するために試した 1 つの解決策:
<bean id="VAL1.bar" class="...." />
これにより、実行時に値を指定し、テストでオーバーライドすることができました。残念ながら、これは何らかの方法で を にApplicationContext注入する必要があることを意味します。enumそのため、グローバル変数が必要です。うんざりする
さらに悪いことに、値を検索するのgetBar()が遅すぎます。これを解決するためsynchronize getBar()に使用できます。if(bar!= null)bar=context.get(name()+".bar");
enumしかし、値自体を使用するのと同じくらい安全で高速な、これなしの方法はありますか?