0

だから私は MVP パターンを使用して私の最初の Java アプリケーションを書いています。MVP トライアドの 1 つは一方向通信であり、基本的にビューは読み取り専用です。

モデルが 1 つ、プレゼンターが 1 つ、ビューが 1 つしかない場合、新しいプレゼンター オブジェクトを作成し、モデルのオブザーバー リスト以外の場所への参照を保持しないというバックトラックはありますか?

明確にするために、これは私が「通常」行う方法です。

private Result result;
private ResultPresenter resultPresenter;
public SomePresenter(SomeInterface view) {
    result = new Result();
    resultPresenter = new ResultPresenter(result, view.getResultView());
}

これが私がやりたい方法です:

private Result result;
public SomePresenter(SomeInterface view) {
    result = new Result();
    new ResultPresenter(result, view.getResultView());
}

ResultPresenter は結果のオブザーバーです。

主な質問は、ResultPresenter がガベージ コレクターによってクリアされるかどうかです。

4

1 に答える 1

1

とりわけ (ビューの初期化など)、ResultPresenter1 つ以上のオブザーバーをインスタンス化または実装し、それらを「結果」と「結果ビュー」の両方に登録します。これらのクラスは、オブザーバーへの参照を保持し、必要に応じて通知します。

これを行うにはいくつかの方法がありますが、一般的なパターンは匿名の内部クラスです。これらの匿名内部クラスはインスタンス化子への参照を保持しているため、ResultPresenterガベージ コレクションは行われません。
もう 1 つのオプションは、最上位クラスをオブザーバーとしてインスタンス化することです。この場合、プレゼンターがまだ参照されているかどうかは、オブザーバーの実装に依存します。
最後に、プレゼンター自体がオブザーバーのインターフェースを実装できます (考えただけでぞっとします)。明らかに、モデルとビューはプレゼンター自体への参照を保持しますが、オブザーバーと見なし、ガベージ コレクションは行われません。

たとえそうなったとしても、プレゼンテーションをセットアップしてオブジェクトを相互にリンクするためだけに必要であり、その後は不要になるだけなので、害はありません。

于 2012-06-15T04:45:48.790 に答える