|
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object | +--jp.ne.so_net.ga2.no_ji.jcom.ReleaseManager
ReleaseManager 参照カウンタ管理クラス。 解放しなければならないオブジェクトを管理します。 比較的簡単なプログラムでは以下の形で利用して下さい。
// 比較的短命のプログラム ReleaseManager rm = new ReleaseManager(); try { IDispatch foo = new IDispatch(rm ,progid); // ... } catch(JComException e) { e.printStackTrace(); } finally { rm.release(); }また、サーバーアプリケーションや、複雑で長時間動作するアプリケーション では、ReleaseManagerの生成からrelease()を行うまでに、オブジェクトを解放しな ければならない場合があります。オブジェクトが解放しないと、メモリを圧迫して しまうからです。その場合は、適当な処理単位をpush()とpop()で囲むことにより、 その中で確保されたオブジェクトを解放します。 push()とpop()は必ず対になるようにしてください。 その対を push() pop() push() pop()というふうに、複数回呼ぶことができます。 また、push() push() pop() pop()というふうに、ネストすることもできます。 以下の例では、for文の単位でオブジェクトを解放しています。
// 比較的寿命の長いプログラム ReleaseManager rm = new ReleaseManager(); try { IDispatch foo = new IDispatch(rm ,progid); // ... for(int i=0; i<files.length; i++) { rm.push(); // ... rm.pop(); // for文の中で生成されたオブジェクトを解放 } } catch(JComException e) { e.printStackTrace(); } finally { rm.release(); }複数のCOMを同時に扱うとき、その生成と解放のタイミングが異なる場合があります。 例えば、1つのDBをCOMとして扱い、複数のEXCELもまたCOMとして扱う場合です。 DBは最初に1回生成するのに対し、EXCELは複数回生成することになるからです。 その場合は複数の
ReleaseManager
を生成し、それぞれに割り当てることにより、
オブジェクトの解放についてキメの細かい制御を行うことができます。
別のCOMに対して、同じ ReleaseManager
を使うことも、異なる
ReleaseManager
を使うこともできます。また、生成する箇所を
別のブロック(メソッド、スレッド等)にすることもできます。
// 寿命の異なる複数のCOMを扱うプログラム(例1) ReleaseManager rmDb = new ReleaseManager(); ReleaseManager rmExcel = new ReleaseManager(); try { IDispatch comDB = new IDispatch(rmDb ,"foo.DB"); IDispatch comExcel = new IDispatch(rmExcel ,"Excel.Application"); // ... for(int i=0; i<table.length; i++) { rmExcel.push(); // ... rmExcel.pop(); //EXCELオブジェクトのみ解放 } } catch(JComException e) { e.printStackTrace(); } finally { rmExcel.release(); rmDb.release(); }
// 寿命の異なる複数のCOMを扱うプログラム(例2) ReleaseManager rmDB = new ReleaseManager(); try { IDispatch comDB = new IDispatch(rmDB ,"foo.DB"); rmDB.push(); ReleaseManager rmExcel = new ReleaseManager(); try { IDispatch comExcel = new IDispatch(rmExcel ,"Excel.Application"); // ... for(int i=0; i<table.length; i++) { rmExcel.push(); rmDB.push(); // ... rmDB.pop(); // DBオブジェクトのみ解放 rmExcel.pop(); // EXCELオブジェクトも解放 } } catch(JComException e) { e.printStackTrace(); } finally { rmExcel.release(); } rmDB.pop(); // DBオブジェクトのみ解放 } catch(JComException e) { e.printStackTrace(); } finally { rmDB.release(); }
IDispatch
,
IUnknown
コンストラクタの概要 | |
ReleaseManager()
ReleaseManagerを作成します。 |
メソッドの概要 | |
void |
add(IUnknown jcom)
IUnknown を現在のスタックに追加します。 |
void |
finalize()
すべてのスタック上のIUnknownを解放します。 |
void |
pop()
現在のスタック上のIUnknownを解放します。 |
void |
push()
新しいスタックを生成します。 |
void |
release()
すべてのスタック上のIUnknownを解放します。 |
java.lang.String |
toString()
内部で保持しているIUnknownクラス、またはそれから継承したクラスのオブジェクト を以下の形で表示します。 |
クラス java.lang.Object から継承したメソッド |
clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait |
コンストラクタの詳細 |
public ReleaseManager()
メソッドの詳細 |
public void add(IUnknown jcom)
public void push()
public void pop()
public void release()
public void finalize()
filnalize()
を呼ぶことを
保証していません。
通常は、try〜catch文でJComExceptionをキャッチし、
finally文でrelease()を明示的に呼ぶようにしてください。java.lang.Object
内の finalize
public java.lang.String toString()
{ { 4769e4(1)jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelApplication 476eb8(1)jp.ne.so_net.ga2.no_ji.jcom.IDispatch 477c98(1)jp.ne.so_net.ga2.no_ji.jcom.IDispatch 477ed4(1)jp.ne.so_net.ga2.no_ji.jcom.IDispatch 478004(1)jp.ne.so_net.ga2.no_ji.jcom.IUnknown 478694(2)jp.ne.so_net.ga2.no_ji.jcom.IDispatch 4788f4(2)jp.ne.so_net.ga2.no_ji.jcom.IDispatch 478b30(2)jp.ne.so_net.ga2.no_ji.jcom.IDispatch 478694(2)jp.ne.so_net.ga2.no_ji.jcom.IDispatch 4788f4(2)jp.ne.so_net.ga2.no_ji.jcom.IDispatch 478b30(2)jp.ne.so_net.ga2.no_ji.jcom.IDispatch } }
java.lang.Object
内の toString
|
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |