1

次のようなカスタム オブジェクトがあります。

public class House
{
    private Roof r;
    private Wall w;
    private Floor f;

    public House()
    {
        this.r = new Roof();
        this.w = new Wall();
        this.f = new Floor();
    }
}

House次に、オブジェクトの新しいインスタンスを作成します。

public static void main()
{
    House h = new House();
}

これで、次の 4 つのオブジェクトができました。

  • ハウス h
  • ルーフr
  • 壁w
  • フロアf

屋根r、壁w、床fは家に完全に依存します。

したがって、 House を削除する場合はh、それらも削除する必要があります。

それを行う正しい方法は何ですか?


Houseこのメソッドをクラスに追加するとどうなりますか:

public void remove()
{
    this.r = null;
    this.w = null;
    this.f = null;
}

hそして、すべてのコンポーネントを含むHouse を削除する必要がある場合は、次のように記述します。

public static void main()
{
    h.remove();
    h = null;
}

これでうまくいくと思いますが、よくわかりません。

また、何か良い方法はないでしょうか?

そして、はい、パブや旅館などについては何もありません:)

4

3 に答える 3

1

ガベージコレクションが発生することにまったく依存することはできません。と呼んSystem.gc()でも、何ができるか保証はありません。システムがガベージコレクションを実行することを決定すると、到達不能な参照が収集される場合がありますが、小さなアプリケーションを実行すると、コレクターが実行されない場合があります。

オブジェクトが破棄されたときに通知を受け取る必要がある場合は、とを使用する必要がありjava.lang.ref.PhantomReferenceますjava.lang.ref.ReferenceQueue。に依存しないでくださいObject.finalize()。しかし、それはあなたの問題ではないようです。あなたは単に自分の後で片付けたいだけです。アプリケーションのパフォーマンスに必要な場合にのみ注意する必要があります。

于 2013-03-18T03:03:10.987 に答える
0

Houseのインスタンスへの参照がない場合、それらは自動的にガベージコレクションされるため、すべてのインスタンス変数をnullにする必要はありませんHouse

それらが他の場所から参照されている場合はどうなりますか?しかし、私はそれらを「親」オブジェクトの削除で削除してほしい。

このため、クラス外のどこかからオブジェクトを参照するたびに弱参照を使用する必要があります。このように、オブジェクトを指す唯一の強力な参照は。の内部にあるHouseため、オブジェクトへの参照がなくなったときに、オブジェクトはガベージコレクションされます。HouseHouse

于 2013-03-18T08:28:57.263 に答える
-1

あなたが与えた解決策はほとんど正しいです。オブジェクト参照を null としてマークすると、ガベージ コレクタが実行を開始するたびに、JVM ガベージ コレクタによってそのオブジェクトが破棄され、メモリから削除されます。

参照変数を NULL に設定した後、手動でガベージ コレクターにガベージを収集するように指示することもできます。

于 2013-03-18T02:59:48.297 に答える