- - PR -
文字列の参照について質問
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-11-24 15:40
tak3さん、Sameさん、MMXさんご回答ありがとうございました。
そうなんですか・・・ free_B()とした時にclsBはGCの対象になるのでしょうか? "clsB = null;"としてはいるものの、clsBのstrBへの参照は残っているから strBがGCの対象にならないのは理解できるのですが、じゃあclsBはどうなんでしょう? | ||||||||
|
投稿日時: 2004-11-24 15:45
サンプルのコードについてですが、おそらく現実にそんなコードを書くことはしないだろう
とは思いますが一応。 相互のメンバフィールドを書き換え合うようなクラスは、クラス設計として好ましくないと 思いますよ。そこまで依存関係が強いなら、クラスを1つにするか、一方をもう一方の内部 クラスにするなどして、影響範囲を分かりやすくするべきかと思います。 また、コンストラクタ内部で外部のクラスに対してthisポインタを公開してしまう(さらに 公開した先でそのポインタ経由でメンバ変数を書き換えてしまう)のは、たまに発生する タイプの厄介なバグの原因なのでやめたほうがよい、とIBMのDWに書いてあったのを読んだ 覚えがありますよ。 コンストラクタによる初期化が完了していないオブジェクトのthisポインタが参照している 先がどういう状態になっているかなんて、いかにも危なそうですよね。 | ||||||||
|
投稿日時: 2004-11-24 15:56
clsBはGCの対象になります。strBをclsBの所有物のように捉えておられるように思いますが、 単にstrBはclsBから参照されているだけで、clsBが消滅したらstrBに対する参照が一つ減る だけです。 | ||||||||
|
投稿日時: 2004-11-25 02:02
「どうにも参照の破棄が気になる」のでしたら、java.lang.Object#finalize()
をオーバーライドし、フィールドの参照全てにnull値を代入すれば宜しいかと。
尚且つ、Cls_Aのfree_B()でjava.lang.System#gc()を呼び出せば「やれることはやった」 という(自己)満足感は得られるかもしれません (--;
そもそもJavaではオブジェクト破棄の権限はプログラマ側にはありません からねぇ、、、ある程度は致し方ないかと。 |