0

ObjectAとObjectBの2つのクラスがあるとします。クラスObjectAには、ObjectB次のようにクラスのオブジェクトを作成するメソッドがあります。

private ObjectB createObjectB() {
    Object b = new ObjectB();
    return b;
 }

のすべてのインスタンスを追跡したいObjectB。これを行うためのより良い方法は何ですか?

  • ArrayList内部クラスとしてすべてのオブジェクトを追跡しますObjectA
  • または、内のクラス変数ObjectB

各方法の長所と短所は何ですか?ObjectBObjectAのこの1つのメソッドからのみオブジェクトが作成されることがわかっている場合、違いはありますか?

ObjectAのインスタンスは1つだけですが、のインスタンスの数ObjectBは可変であることに注意してください。

4

6 に答える 6

1

コードの無関係な部分から作成されたすべてのオブジェクトにアクセスする場合にのみ、その方法で作成されたオブジェクトを「追跡」する必要があります。それ以外の場合、1)作成されたオブジェクトは変数によって保持されるため、アクセスできます。2)オブジェクトへの参照がなくなると(到達不能になるため)、ガベージコレクターは最終的にメモリをクリーンアップします。

それらを追跡する場合は、コレクションにオブジェクトがある間はGCがメモリを解放できないことに注意してください。これにより、メモリ不足エラーが発生する可能性があります

于 2012-06-07T20:49:34.230 に答える
0

ObjectAインスタンスが1つだけで、メソッドがある場合は、インスタンス自体createBにリストを保持します。しかし、実際にはそれは重要ではないと思います。ObjectA

public ObjectB createB(){
   Object B = new ObjectB();
   allBs.add(b); // assuming some sort of List
   return b;
}

なぜあなたがこれをしたいのか知りたいです。アプリとそのアーキテクチャによっては、特にスレッドの問題が発生する可能性があります。

于 2012-06-07T20:48:17.967 に答える
0

ObjectBにリストを保持することは意味がありませんが、作成したすべてのBオブジェクトへの参照が必要な場合は、ObjectAにリストを保持することは意味があります。

于 2012-06-07T20:49:17.980 に答える
0

私にとっては、オブジェクト A とオブジェクト C は、オブジェクト B インスタンスを管理しているクラスのようです。

ベース サービス クラスのサブクラスであるさまざまなサービスを追跡する必要がある同様のシナリオがあります (私の場合、オブジェクト B はベース クラスです)。

これらのサービスを作成/開始/停止/再起動/削除するために、2つの異なる目的のために2つのマネージャークラスがあります(あなたの場合はオブジェクトAとオブジェクトCのように)。

両方のマネージャー クラスに HashMap があります

クラスAまたはCのBオブジェクトを停止/開始/作成/破棄/削除するメソッドを使用できます。これは、オブジェクトBの「名前」を取り、オブジェクトBで対応する操作を開始します。

また、ベスト プラクティスとして、SessionContextListener で必ず停止/削除操作を呼び出して、この HashMap に追加されたオブジェクトを削除してください。

于 2012-06-07T21:43:38.283 に答える
0

ObjectCについてあなたが言ったことに基づいて、ObjectA(およびC)がObjectBの配列を維持することが最も理にかなっていると言います。(実際には、B を加算および減算することが予想される場合は、配列の代わりにある種のコレクションを使用することをお勧めします)。

次に、A によって作成された B の数を返すメソッドを作成できます (例: A.countB())。

作成された B の総数が必要で、A.countB()+C.countB() を使用できない場合は、次の 2 つのオプションがあります。キーが作成者オブジェクト (A、C など) であり、値は B のコレクションです。

主に、作成されたオブジェクトがぶらぶらするという理由で、これを思いとどまらせます(したがって、GC がなく、メモリの問題が発生する可能性があります)。

もう 1 つの方法は、マネージャー クラスを使用して B を作成および追跡し、インスタンスの使用が終了したら逆参照に十分注意することです。

于 2012-06-07T21:58:18.150 に答える
0

それは、何を達成する必要があるかによって異なります。のインスタンスObjectB(これは悪い名前ですが) は互いに通信できるようにする必要がありますか? その場合、クラス (つまりstaticフィールド) にグローバル変数を作成するか、リストを保持して のObjectA各インスタンスに「注入」ObjectBする必要があります。つまり、両方の場所で参照を保持する必要があります。 .

のインスタンスがObjectB互いに通信する必要がない場合は、通常、リストを に保持するだけで十分ObjectAです。

しかし、ほとんどの場合、リストを保持する必要はまったくありません。すべてのメモリを消費するまでリストが大きくならないようにする必要があるため、危険ですらあります。

一般的なルールは、不要な依存関係を避けることです。リストを保持することで、コストのかかる依存関係を導入することになります (たとえば、メンテナンスに加えて、最初にコードを記述する必要があります)。

あなたが書くもののコストには常に気をつけてください - これらの安価なものが、あなたを絞め殺す依存関係の本当に高価な山になるものに蓄積するのは非常に簡単です.

于 2012-06-07T20:58:06.117 に答える