jp.ne.so_net.ga2.no_ji.jcom
クラス ReleaseManager

java.lang.Object
  |
  +--jp.ne.so_net.ga2.no_ji.jcom.ReleaseManager

public class ReleaseManager
extends java.lang.Object

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
 

コンストラクタの詳細

ReleaseManager

public ReleaseManager()
ReleaseManagerを作成します。 解放しなければならないCOMオブジェクトを管理します。
メソッドの詳細

add

public void add(IUnknown jcom)
IUnknown を現在のスタックに追加します。

push

public void push()
新しいスタックを生成します。

pop

public void pop()
現在のスタック上のIUnknownを解放します。 その後、1つ前のスタックに戻します。

release

public void release()
すべてのスタック上のIUnknownを解放します。

finalize

public void finalize()
すべてのスタック上のIUnknownを解放します。 JavaVMはプログラム終了時に filnalize() を呼ぶことを 保証していません。 通常は、try〜catch文でJComExceptionをキャッチし、 finally文でrelease()を明示的に呼ぶようにしてください。
オーバーライド:
クラス java.lang.Object 内の finalize

toString

public java.lang.String toString()
内部で保持しているIUnknownクラス、またはそれから継承したクラスのオブジェクト を以下の形で表示します。 16進数はインターフェースのポインタ、 括弧の中の数値は参照カウンタの数、その次はクラス名です。 任意の箇所でのオブジェクトの状態をスナップショット的に見ることができます。
{
{
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