廃れたオブジェクト参照
Effective Java の「廃れたオブジェクトの参照を取り除く」と言う項目を実際に確認してみます。
この記事を読むまではこういったことが起こっているとは知りませんでした。
Javadoc ではこうなってるのでてっきり綺麗さっぱりな状態になってるとかってに思ってました。(^^;
また、ネット上にある Stack 関係の記事でもほとんどこの廃れたオブジェクト参照を取り除くことはしてないですね。
では、廃れたオブジェクト参照が残るコードを
上記のコードは Effective Java に載っていたものを元にほんの少しだけ変更をくわえてあります。
確認のため NetBeans 6.7M2 を使ってみます。
elements の値を確認するために新規ウォッチポイントを設定します。
elements を右クリックして新規ウォッチポイントを・・ あれれ? 新規観察に変わってますね(^^;
新規観察ウィンドウが出ますのでウォッチ表現を設定して [ 了解 ] ボタンを押します。
次にブレークポイントを設定します。
ここでは pop() メソッドで 戻り値の result に elements [--saize] から値を渡し、その後 elements [size] オブジェクトは削除されると期待してました。
つまり、ブレークポイントでプログラムが止まった時の elements [size] の値は null だろうと・・・
では、確認のためにプロジェクトをデバッグしてみます。
あらら・・・ elements [2] の値が残ってます。
続行します。
出力ウィンドウにはちゃんと 羊が 2匹と表示されてます。
この時点では elements [2],elements [1] は null になっていてほしい・・・
続行させます。
出力ウィンドウには期待通りの結果が出てます。
続行させます。
とうとう elements [] は削除されることはありまでんでした。
このようにもう使われることのないオブジェクト参照のことを廃れたオブジェクト参照というようです。
Java 言語の利点の一つであるガーベッジコレクタで回収されることもありません。
もったいない!(by 矢沢永吉
この問題を解決するために pop() メソッドに
35 行目のコードを追加し elements [] に null を設定します。
デバッグを実行します。
今度はちゃんと elements [2] が null に変わってます。
続行します。
出力は前回と同様に期待通りの動作のままです。
続行します。
続行します。
これで期待通りの動きとなりました。
Javadoc のオブジェクトを削除という意味は何なのだろうか?
とりあえず確認完了です。(^^)