- PR -

文字列の参照について質問

投稿者投稿内容
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2004-11-24 15:40
tak3さん、Sameさん、MMXさんご回答ありがとうございました。

引用:

そもそも、Stringは不変オブジェクトなので参照ウンヌンは気にしなくてもいいと思います。


そうなんですか・・・
free_B()とした時にclsBはGCの対象になるのでしょうか?
"clsB = null;"としてはいるものの、clsBのstrBへの参照は残っているから
strBがGCの対象にならないのは理解できるのですが、じゃあclsBはどうなんでしょう?

シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-24 15:45
サンプルのコードについてですが、おそらく現実にそんなコードを書くことはしないだろう
とは思いますが一応。

相互のメンバフィールドを書き換え合うようなクラスは、クラス設計として好ましくないと
思いますよ。そこまで依存関係が強いなら、クラスを1つにするか、一方をもう一方の内部
クラスにするなどして、影響範囲を分かりやすくするべきかと思います。

また、コンストラクタ内部で外部のクラスに対してthisポインタを公開してしまう(さらに
公開した先でそのポインタ経由でメンバ変数を書き換えてしまう)のは、たまに発生する
タイプの厄介なバグの原因なのでやめたほうがよい、とIBMのDWに書いてあったのを読んだ
覚えがありますよ。
コンストラクタによる初期化が完了していないオブジェクトのthisポインタが参照している
先がどういう状態になっているかなんて、いかにも危なそうですよね。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-24 15:56
引用:

takaさんの書き込み (2004-11-24 15:40) より:
"clsB = null;"としてはいるものの、clsBのstrBへの参照は残っているから
strBがGCの対象にならないのは理解できるのですが、じゃあclsBはどうなんでしょう?


clsBはGCの対象になります。strBをclsBの所有物のように捉えておられるように思いますが、
単にstrBはclsBから参照されているだけで、clsBが消滅したらstrBに対する参照が一つ減る
だけです。
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2004-11-25 02:02
「どうにも参照の破棄が気になる」のでしたら、java.lang.Object#finalize()
をオーバーライドし、フィールドの参照全てにnull値を代入すれば宜しいかと。

コード:

public class Cls_B {
  Cls_A c_A;
  String strB = "BBB"
  public Cls_B(Cls_A cls){
    c_A = cls;
    c_A.strA = strB;
  }
  protected void finalize() throws Throwable {
    c_A  = null;
    strB = null;
  }
}



尚且つ、Cls_Aのfree_B()でjava.lang.System#gc()を呼び出せば「やれることはやった」
という(自己)満足感は得られるかもしれません (--;

コード:

void free_B() {
  clsB = null;
  System.gc();
}



そもそもJavaではオブジェクト破棄の権限はプログラマ側にはありません
からねぇ、、、ある程度は致し方ないかと。

スキルアップ/キャリアアップ(JOB@IT)