0

それぞれ独自のスレッド内に2つのオブジェクトを作成しています

    Conversation c = new Conversation();
    Thread t1 = new Thread(c);
    t1.start();

    HunterCom ns = new HunterCom(c);
    Thread t2 = new Thread(ns);
    t2.start();

会話オブジェクト(c)にHunterComオブジェクトへの参照を送信する必要があります(ns)

とにかくこれを行うことはありますか?cに送信したいときにnsが作成されていないので、苦労しています。

4

2 に答える 2

3

cとnsを相互に参照させたいようです。つまり、cにはnsへの参照があり、nsにはcへの参照があります。

それがあなたが求めているものである場合は、HunterComオブジェクトを設定できるようにするセッターをcに配置する必要があります。

public class Conversation{
  void setHunterCom(HunterCom a)...
}

とはいえ、このような参照サイクルがある場合は、通常、レビューが必要なオブジェクトモデルを示しています。タマネギを剥がすと、循環参照を排除するリファクタリングを見つけることができる場合があります。これは、コードを将来的に操作しやすくするため、実行する価値があります。

于 2013-01-05T00:13:25.750 に答える
0

1つのオプションは、両方への参照を保持できる3番目のクラスを作成することです。

class ComManager {
    // getter and setter for Conversation
    // getter and setter for HunterCom
}

次に、このクラスをインスタンス化し、引数として両方のオブジェクトに渡します。

ComManager com = new ComManager();
Conversation c = new Conversation(com);
HunterCom ns = new HunterCom(com);

これで、両方のオブジェクトにへの参照がありますcom。これには、との両方のgetterメソッドがConversationありHunterCom、各スレッドの実行中に使用できます。

2番目のオプションは、インスタンス化する方法の順序を変更することです。引数なしで作成ConversationHunterCom、次のように相互に参照を割り当てます。

Conversation c = new Conversation();
HunterCom ns = new HunterCom();
c.setHunterCom(ns);
ns.setConversation(c);

おそらく他にもいくつかの同様のオプションがあります。うまくいけば、これはあなたに他のパターンを見つけてあなたが探しているものを手に入れるための出発点を与えるでしょう。

于 2013-01-05T00:24:35.383 に答える