21.5.1 タイプドオブジェクトラッパーのインプリメント
タイプドオブジェクトラッパーを,idl2cppコンパイラ(C++)またはidl2javaコンパイラ(Java)で生成した<interface_name>ObjectWrapperクラスから派生させてください。コードサンプル21-10にAccountインタフェース用タイプドオブジェクトラッパーのインプリメンテーション(Java)を示します。このクラスはAccountObjectWrapperインタフェースから派生していて,balanceメソッドの単純なキャッシングインプリメンテーションを提供していることに注意してください。balanceメソッドは次のような手順で処理を実行します。
-
次のフラグをチェックし,このメソッドが以前に呼び出されたことがあるかどうかを調べます。
-
C++の場合
_inited
-
Javaの場合
_initialized
-
-
今回が最初の呼び出しの場合,チェーンの中にある次のオブジェクトでbalanceメソッドを呼び出し,結果を_balanceに保存し,_inited(C++)または_initialized(Java)をtrueに設定し,値を返します。
-
このメソッドがすでに呼び出されたことがある場合,キャッシュされた値を返します。
- コードサンプル21-9 CachingAccountObjectWrapperインプリメンテーションの一部(C++)
class CachingAccountObjectWrapper : public Bank:: AccountObjectWrapper { public: CachingAccountObjectWrapper() : _inited((CORBA::Boolean)0) {} CORBA::Float balance() { cout << "+CachingAccountObjectWrapper: Before Calling Balance" << endl; if (! _inited) { _balance = Bank::AccountObjectWrapper::balance(); _inited = 1; } else { cout << "+ CachingAccountObjectWrapper: Returning Cached Value" << endl; } cout << "+ CachingAccountObjectWrapper: After Calling Balance" << endl; return _balance; } . . . };
- コードサンプル21-10 CachingAccountObjectWrapperインプリメンテーションの一部(Java)
package BankWrappers; public class CachingAccountObjectWrapper extends Bank.AccountObjectWrapper { private boolean _initialized = false; private float _balance; public float balance() { System.out.println( "+ CachingAccountObjectWrapper: Before calling balance: "); try { if( !_initialized ) { _balance = super.balance(); _initialized = true; } else { System.out.println( "+ CachingAccountObjectWrapper: Returning Cached value"); } return _balance; }finally { System.out.println( "+ CachingAccountObjectWrapper: After calling balance: "); } } }