TOP設計・移行・活用> ストリーム
Javaコーディング規約
Javaコーディング規約

第11回:コレクション・ストリーム・例外に関するコーディング規約
著者: 電通国際情報サービス
高安 厚思、東田 健宏、玉村 雅也
   2006/1/12
前のページ  1  2   3  4  次のページ
ストリーム

   ストリーム処理をする際にはメモリの取り扱いに留意する必要があります。この点はメモリリークなどが原因となりパフォーマンスに影響する点ですので、下記規約を良く理解するようにしてください。
ストリームを扱うAPIを利用するときは、finallyブロックで後処理をする(C_STM001)

   ストリームを扱うAPIを利用するときはclose()メソッドを実装してください。またそのclose()メソッドは必ず実行されるようにしてください。この規約を守ることでメモリリークの発生を防ぐことができます。

   以下の例ではFileInputStream()のコンストラクタで例外が発生しても、close()メソッドがfinallyブロックにあるため、必ず実行されます。もしclose()メソッドを別の場所(例えばis.read();の次の行)に記述してしまうと、FileInputStreamのコンストラクタでの例外が発生した場合、変数isに格納されたStreamはclose()が呼び出されないことになり、メモリリークの原因になってしまいます。

public class FixedSample {
     public void fixedSampleMethod() {
          BufferedInputStream is = null;
          try {
               is = new BufferedInputStream(
                        new FileInputStream("/home/test.txt"));
               is.read();
          } catch(FileNotFoundException fnfe) {
               fnfe.printStackTrace();
          } catch(IOException ioe1) {
               ioe1.printStackTrace();
          } finally {
               try {
                    is.close();
               } catch(IOException ioe2) {
                    ioe2.printStackTrace();
               }
          }
     }
}

   ストリームを扱うAPIを利用するときは、どこで例外が発生した場合でも確実に実行されるように、close()メソッドはfinallyブロックに記述します。


ObjectOutputStreamではreset()を利用する(C_STM002)

   ObjectOutputStreamオブジェクトを扱うときは意識してreset()メソッドを実装してください。ObjectOutputStreamクラスは機能上、書き込まれるすべてのオブジェクトの参照がキャッシュ上に保持されます。

   そのためreset()メソッドが呼び出されるまでメモリ上にキャッシュを持ち続けます。reset()メソッドを呼ばずに多くのオブジェクトを書き出した場合、ガベージコレクションによって回収されることがないため、OutOfMemoryErrorが発生する可能性があります。

   ただしパフォーマンスの観点からキャッシュ機能を利用する場合、reset()メソッドを呼び出した段階でキャッシュがクリアされますので注意してください。

   アクセス速度を高速にするなどといった理由がない限り、OutOfMemoryErrorの発生を防ぐためObjectOutputStreamオブジェクトを使用するときはreset()メソッドを実装しましょう。

reset()を利用した例
public class resetSample {
     public void writeToStream(Object input) throws IOException {
          ObjectOutputStream stream =
               new ObjectOutputStream(
                    new FileOutputStream("output"));
          stream.writeObject(input);
          stream.reset();
     }
}
前のページ  1  2   3  4  次のページ


株式会社電通国際情報サービス 開発技術センター 高安 厚思
著者プロフィール
株式会社電通国際情報サービス  高安 厚思
株式会社電通国際情報サービス 開発技術センター
Java(J2EE)/オブジェクト指向の研究開発やプロジェクト支援、開発コンサルティングに従事。モデル、アーキテクチャ、プロセスが探求対象。今回は Javaコーディング規約2004の仕掛け人。


株式会社電通国際情報サービス 開発技術センター 東田 健宏
著者プロフィール
株式会社電通国際情報サービス  東田 健宏
株式会社電通国際情報サービス 開発技術センター
CTI、Webアプリの開発経験を経て、現在は主にプロジェクトマネジメント支援、プロセスエンジニアリング、ソフトウェア工学研究開発に従事。最近はコーチング、ファシリテーションといったヒューマン系スキルに興味を持ち日々修得に努めている。


株式会社電通国際情報サービス 開発技術センター 玉村 雅也
著者プロフィール
株式会社電通国際情報サービス  玉村 雅也
株式会社電通国際情報サービス アウトソーシング事業部
Securityに関わる研究開発やプロジェクト支援の経験を経て、現在は大手企業の管理会計システムのBPRプロジェクトに従事。最近は難敵ABAPと戦いながら、日々を送っている。


INDEX
第11回:コレクション・ストリーム・例外に関するコーディング規約
  はじめに
ストリーム
  例外
  Error、Throwableクラスを継承しない(C_EXT004)