[Java]side-effect from finalize
SingletonやTypeSafeEnumなどのパターンとシリアライズが相性が悪いことを前に書いた。
そこでは、readResolveメソッドを実装することを書いたが、readResolveの実装には一つ注意点がある。
readResolveでオブジェクトを置き換えるようにすると、ObjectInputStreamの利用側にはデシリアライズされたオブジェクトは公開されなくなる。
しかし、VMとファイナライザはreadREsolveメソッドが破棄したオブジェクトを認識しているため、次回のGCでObject#finalize()が呼び出されることになる。
リソースの開放などをfinalizeに書いている場合、readResolveによって破棄されたオブジェクトが悪さをしないように注意する必要がある。
ラベル: Java


0 件のコメント:
コメントを投稿
登録 コメントの投稿 [Atom]
<< ホーム