WAS 小ワザ集

第20回:Application Anti Pattern(5) 親クラスのstaticメソッドを利用するためだけに

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: WAS 小ワザ集

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:WAS 小ワザ集

このシリーズの続きに乞うご期待。

Anti Pattern

あるクラスには、Thread#currentThread()を使用する処理が何回も記述されていました。そのクラスを作成したプログラマーは、タイプ量を減らすため、そのクラスの定義に「extends Thread」を追加しました。これにより「Thread.currentThread()」と書くところが「currentThread()」と書くだけですむようになりました。

Result

そのクラスのインスタンスが利用されるたびに、開放されないヒープエリアがだんだんと増えていくという現象が発生しました。
メモリリークが発生したのです。

Best Practice

java.lang.Threadとそれを継承したクラスのインスタンスは、その実行が完了するまでの間、たとえ他からの参照が一切なくなってもGCの対象となりません。

このクラスでは、start()によるスレッド実行の処理は全く記述されていませんでしたので、そのインスタンスは実行完了前のスレッドのオブジェクトとみなされ、GCが行われても全く開放されない状態になっていました。

Threadクラスに限らず、一般に親クラスを継承すると、クラスのインスタンス作成に伴って、親クラスで定義されているフィールドなど各種リソースも作成されてしまいます。それらを一切使わないのでは、継承をする意味がありません。

オブジェクト指向の一般手法に従い、「is-a」関係にある場合にのみ継承を用いて、その他の目的には使わないでください。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=WebSphere
ArticleID=809640
ArticleTitle=WAS 小ワザ集: 第20回:Application Anti Pattern(5) 親クラスのstaticメソッドを利用するためだけに
publish-date=04122012