- ベストアンサー
インスタンスの生成
クラス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を呼ぶだけでサーバに辿り着けるのでしょうか? すみません、、混乱してきました(汗
- みんなの回答 (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を呼ぶ >だけでサーバに辿り着けるのでしょうか? ソケットをクローズしない限りサーバ側とはつながった ままですよね?要するに電話を切っていないのと同じで すから通信は継続されています。 相手が勝手に切ってしまえば、不通にはなりますけど(笑
その他の回答 (1)
- -soh-
- ベストアンサー率27% (55/201)
こんちゃsohです 1) class A内で Bをクラス変数として宣言しておき class A { B insB; Bをnewする(もしくは使用する)個所で if(insB == null) { insB = new B(); } insB.open() ... とかいいんじゃないでしょうか? 2)前半部は1)と同じくソケットを変数に保持してnull判定 後半部はごめんなさい、いっている意味がわかりません 3)辿り着くはずです
お礼
ありがとうございます。 徐々にわかってきました。頭で理解するのと同時に実際にコーディングして試してみようと思います。
お礼
インスタンスの概念がだんだんと分かってきました。 class BのstaticメソッドでBのインスタンスを得るというのは、非Javaな人間にとっては嘘みたいに見えますね・・・。(^^; (obj指向やって日が浅いので、あらかじめ存在するコードの中で今どこを実行してるのかばかり気にしてしまって・・・) ありがとうございます、色々と試してみます。