次のようなものを実装するためのより良いパターンを探しています:
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
しかし、値自体を使用するのと同じくらい安全で高速な、これなしの方法はありますか?