• ベストアンサー

インスタンスの生成

クラスA : ユーザインタフェース担当class クラスB : 通信担当class サーバ : 適当なWebサービス とするとき、ユーザからアクセスがあったらクラスAからクラスBを生成し、クラスBでsocketを作ってサーバと送受信、結果をクラスAに返して終了という簡単なものを作っています。 が、これだと「AがBを作って呼ぶ」「Bが通信する」「BがAに結果を返す」と一往復しか動けないので、Aは送信データを全部用意してからBを呼ばないといけません。 ではなく、「AからBに順次データを送り」、「Bはサーバから応答が来たらAに送る」というふうに変えたいと思っています。つまり、HTTPならAからBにGETが飛んで、次にUser-Agentが飛んで・・・最後に\nが飛ぶとBからAにHTMLが来る、みたいな感じですね。が、ここで疑問が出てきました。 1) Aの中でBを生成するのは初回の一回だけ(ですよね?じゃないと違うBができてしまいます)ですが、既にインスタンスがあるのかをどうやって判定するのでしょうか? 2) Bは何度も呼ばれるわけですが、同じく、Bの中でsocketを生成するのに、既にsocketがあるのかを判定できますか?コンパイル時にsocketをnewしていなかったらエラーになりませんか? 3) Bのインスタンスが同じなら、Bが何度呼ばれようとも、さっき作ったsocketは同じだから、AはBを呼ぶだけでサーバに辿り着けるのでしょうか? すみません、、混乱してきました(汗

質問者が選んだベストアンサー

  • ベストアンサー
  • takaP-
  • ベストアンサー率79% (83/105)
回答No.2

クラスBのインスタンスが1つしかない事を保証すれば 良いのですよね? こういう場合は、デザインパターンのSingletonを使え ば良いと思います。 class B {   private static B this_instance = null ;   protected B() {     //何がしかの処理   }   public static B getInstance() {     if( this_instance == null ) {       this_instance = new B() ;     }     return this_instance ;   } } 上記のようにすれば、クラスAでBのインスタンスを 使いたい場合にはB.getInstance()とすれば同一の Bのインスタンスが返って来ます。 >3) Bのインスタンスが同じなら、Bが何度呼ばれよう >とも、さっき作ったsocketは同じだから、AはBを呼ぶ >だけでサーバに辿り着けるのでしょうか? ソケットをクローズしない限りサーバ側とはつながった ままですよね?要するに電話を切っていないのと同じで すから通信は継続されています。 相手が勝手に切ってしまえば、不通にはなりますけど(笑

pythian
質問者

お礼

インスタンスの概念がだんだんと分かってきました。 class BのstaticメソッドでBのインスタンスを得るというのは、非Javaな人間にとっては嘘みたいに見えますね・・・。(^^; (obj指向やって日が浅いので、あらかじめ存在するコードの中で今どこを実行してるのかばかり気にしてしまって・・・) ありがとうございます、色々と試してみます。

その他の回答 (1)

  • -soh-
  • ベストアンサー率27% (55/201)
回答No.1

こんちゃsohです 1) class A内で Bをクラス変数として宣言しておき class A { B insB; Bをnewする(もしくは使用する)個所で if(insB == null) { insB = new B(); } insB.open() ... とかいいんじゃないでしょうか? 2)前半部は1)と同じくソケットを変数に保持してnull判定 後半部はごめんなさい、いっている意味がわかりません 3)辿り着くはずです

pythian
質問者

お礼

ありがとうございます。 徐々にわかってきました。頭で理解するのと同時に実際にコーディングして試してみようと思います。

関連するQ&A