2010年5月18日火曜日

Effective javaまとめ6 ファイナライザを避ける2

チャリンコを家の中で保管することに成功しますた。
後輪を外すのが意外と簡単で感動した。そしてBBをピカピカにした。
快感・・・

-----------------------------------------------------
■項目6 ファイナライザを避ける2

ファイナライザの使用を避けるべき理由は前回の内容以外にまだあります。

ファイナライズの最中に例外が発生した場合、その例外は無視され、ファイナライズは終了します。
キャッチされなかった例外は、そのオブジェクトを不正な状態のままにする可能性があります。
また、通常、キャッチされなかった例外は、スレッドを終了させスタックトレースを表示しますが。ファイナライザ内ではそのようになりません。ワーニングさえ表示しません。

さて、ファイナライザの使用を控えるべき理由を記載してきましたが、ファイルやスレッドなどの終了を必要とする資源を持っているオブジェクトのクラスに対して、ファイナライザを各代わりに、何をするべきでしょうか。

明示的終了メソッドを提供すべきです。

各インスタンスが必要なくなった時点で、クライアントに明示的終了メソッドを呼び出すことを要求するのです。注意すべき点は、そのインスタンス自身が、「自分は終了した」という事実を保存しておく必要があるという点です。終了した後にオブジェクトが利用された場合、IllegalStateExceptionをスローすべきです。
(APIによると、IllegalStateExceptionは、不正または不適切なときにメソッドが呼び出されたことを示します。)

明示的終了メソッドの典型的な例は、InputStreamやOutputStreamに対するcloseメソッドです。

明示的終了メソッドは、大抵try finallyブロックと伴に利用されます。
finallyブロック内で明示的終了メソッドを呼び出します。
以下の2点がメリットとして挙げられるためです。

 ・ オブジェクトが必要な範囲をtry finallyブロックで囲むことで、オブジェクトが不要になり次第、迅速に後始末ができる。
 ・例外が発生しても確実に後始末を行うことが可能

では、ファイナライザが有効なときはどんな時でしょうか・・。

正当な使い方は2つあります。

--> つづーく

0 件のコメント:

コメントを投稿