バルキングパターンとは、オブジェクトが特定の状態にある場合にのみ、そのオブジェクトに対してアクションを実行するソフトウェア設計パターンです。例えば、オブジェクトがZIPファイルを読み込み、呼び出し元メソッドがZIPファイルが開いていない状態でオブジェクトのgetメソッドを呼び出すと、オブジェクトは要求に対して「バルキング」します。例えばJavaプログラミング言語では、このような状況で がスローされる可能性があります。C #ではとなります。 IllegalStateExceptionInvalidOperationException
この分野の専門家の中には、Balkはデザインパターンというよりアンチパターンだと考える人もいます。オブジェクトがAPIをサポートできない場合、問題となる呼び出しが利用できないようにAPIを制限するか、制限なしに呼び出しができるようにする必要があります。具体的には以下のようになります。
- 「健全な状態」で作成される。
- 正常な状態になるまで利用できない。
- ファサードとなり、正常な状態にあるオブジェクトに応答します。
使用法
このパターンを使用するオブジェクトは、通常、一時的に不安定な状態になるものの、その状態が続く時間は不明です。オブジェクトが不安定な状態を既知の有限時間継続する必要がある場合は、ガード付きサスペンションパターンの方が適している可能性があります。
実装
以下は、バルキングパターンの実装における一般的なシンプルな例です。[ 1 ]上記の定義で示されているように、「synchronized」行がどのように使用されているかに注目してください。ジョブメソッドが複数回呼び出された場合、1つだけが処理を続行し、他の呼び出しは何も返しません。もう一つ注目すべき点はjobCompleted()メソッドです。メソッドが同期されている理由は、他のスレッドがフィールドの変更を確実に認識できるようにするには、そのフィールドへのアクセスをすべて同期させるしかないためです。実際には、ブール変数であるため、明示的に同期させず、volatile として宣言するだけで済みます。これは、他のスレッドが古いキャッシュ値を読み取らないようにするためです。
パブリッククラスExample {プライベートブール値 jobInProgress = false ;public void job () { synchronized ( this ) { if ( jobInProgress ) { return ; } jobInProgress = true ; } // ジョブを実行するコードをここに記述します// ... jobCompleted (); }void jobCompleted () { synchronized ( this ) { jobInProgress = false ; } } }参照
参考文献
- ^ Grand, Mark (2002). 『Patterns in Java, Volume 1: A Catalog of Reusable Design Patterns Illustrated with UML, Second Edition』インディアナポリス、インディアナ州: John Wiley & Sons.