2

たとえば、メソッド.addObserver()を使用する場合:

  class ExampleOne implements Observer {

  class ExampleTwo extends Observable {


  ExampleOne one = new ExampleOne();

  ExampleTwo two = new ExampleTwo();

  two.addObserver(one)

この場合、インスタンスオブジェクト「two」と「one」の間の接続、または静的な状況のようなclass.classは、インスタンスのように見えますが、これがオブザーバーとオブザーバーの間の接続であるかどうかはわかりません。 「1つ」または「2つ」のいずれかがガベージコレクションされた場合、または範囲外になった場合に発生しますか?それはオブザーバーの設定を破壊しますか。

この例は、サーバーがクライアントから文字列メッセージを受信し、オブザーバーを使用して新しいテキストメッセージが到着したときに通知する場合です。インスタンス変数の1つがスコープ外になり、ガベージコレクションが行われると、システムが破損するため、メッセージが到着したときに通知が送信されなくなります。これは正しいです?

4

2 に答える 2

2

Observableメソッドを使用して登録されたすべてのオブザーバーへの参照vectorを保持するがあります。そのため、オブザーバーがスコープ外になっても、それへの参照はオブザーバブルに存在し続け、ガベージ コレクションは行われませんaddObserver()

ガベージ コレクションを行うには、 を呼び出すと、removeObserverガベージ コレクションが実行されます。

範囲外の場合Observableははい、オブザーバーに通知は送信されません。また、オブザーバーはガベージコレクションできます。

この場合、インスタンス オブジェクト "two" と "one" の間の接続、または静的な状況のような class.class です。

はい、すべてがインスタンスで発生しており、ここでは統計は関与していません。

于 2013-02-27T08:22:55.030 に答える
-1

Observableは、明示的に削除されるまで、追加された各オブザーバーへの参照を保持します。したがって、Observableがガベージコレクションの対象となるのは、Observableが対象となる場合のみです。

コードによって導入されない限り、ObserverからObservableへのバックリファレンスはありません。したがって、オブザーバーへの参照を保持しても、Observableのガベージコレクションが妨げられることはありません。

Observableのソースコードをいつでも見て、それがどのように行われるかを確認できます。

public synchronized void addObserver(Observer o) {
    if (o == null)
        throw new NullPointerException();
if (!obs.contains(o)) {
    obs.addElement(o);
}
}

obsその要素への参照を保持するVectorはどこにありますか。

于 2013-02-27T08:21:06.943 に答える