• ベストアンサー

インスタンスの生成

クラス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を呼ぶだけでサーバに辿り着けるのでしょうか? すみません、、混乱してきました(汗

  • Java
  • 回答数2
  • ありがとう数10

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

  • ベストアンサー
  • 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

  • ユーザーインスタンスの生成??

    windos vistaを使っています。 SDカードを差し込むと、 「SQL Serverでのユーザーインスタンスの生成は無効です。sp_configure'user instances enabled'を使用して、ユーザーインスタンスを生成してください。」 とゆうエラーが出てしまい、データを入れれません。 SmartPhotoも立ち上げれません。どうしたらいいでしょうか? よろしくお願いします。

  • 動的に生成されるインスタンス間のやりとりについて

    あるクラスのインスタンスが動的に複数生成される状態で,一つのインスタンスから, 複数の他インスタンスのメンバ関数(仮に関数A)を呼びたいと考えています. そこでstaticなインスタンスのリストのようなものを設けようと考えました. 各インスタンスの関数Aへ関数ポインタの配列を定義し, それによって上記を実現しようと思いました. しかし,インスタンス生成前にインスタンス名を指定して (instance_name_.*p)(); という様に呼べるわけもなく,どう動的にインスタンスのリストを保持するかが思いつきません. 説明が下手ですいません.どなたか教えていただけますでしょうか. よろしくお願いします. 環境 Windows XP, cygwin

  • attachMovieで生成したインスタンスを消す方法

    1.現在A.B.C・・・・という名前の多数のボタンがあります 2.それぞれをクリックすると、A1.B1.C1・・・・とそれぞれのインスタンスがZ_mcというムービークリップ内に生成されます。その時にボタンに記述したスクリプト on (press) { Z_mc.attachMovie( "識別子", "A1", 1); } 3.このままですとA.B.C・・・・とボタンをクリックしていくとインスタンスがA1.B1.C1・・・・と同じ場所に生成されるため、重なってしまいます。 どのようにボタンにスクリプトを記載すれば、前に生成されたインスタンスを削除して、新しいインスタンスを生成できるのでしょうか?よろしくお願いします。

    • ベストアンサー
    • Flash
  • 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)

    下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・

  • [VB.NET] インスタンス生成とインテリセンス

    VB.NETの勉強をしつつ業務開発をしております。 現在、作成したクラスをインスタンス化した際、インテリセンスが表示されず、困っております。 メソッド内で生成したインスタンスからは、インテリセンスが表示されるのですが、クラス直下で生成したインスタンスでは、インテリセンスが表示されないのです。 Namespace MyName   Public Class Class1     Public Sub test1()       Debug.Print("test1呼び出し")     End Sub   End Class End Namespace Public Class Form1   Dim MyCls = New MyName.Class1 ←○MyNameのインテリセンスでClass1が表示   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load     MyCls.test1() ←×MyNameのインテリセンスでtest1が表示されない     Dim MyCls2 = New MyName.Class1     MyCls2.test() ←○MyNameのインテリセンスでtest1が表示   End Sub End Class インテリセンスは表示されなくても、エラーにはなりません。自分で打ち込めば動作するのですが、共有利用したいので、インテリセンスの説明は表示させたいのです。 インテリセンスとは?というレベルから勉強している超初心者のため、拙い言葉遣いご容赦ください。お知恵をお借りしたく、宜しくお願いします。

  • 《instantiate》(インスタンス化)と《create》(生成)

    《instantiate》(インスタンス化)と《create》(生成)が分かりません。 《instantiate》(インスタンス化)は、必要とする側の分類子の操作が、必要とされる側の分類子のインスタンスを生成することを示す。と書かれています。 《create》(生成)は、必要とする側の分類子が、必要とされる側の分類子のインスタンスを生成することを示す。と書かれています。よく分かりません。 JAVAでコーディングするとどのような感じになるのでしょうか? instantiateで検索していたら以下のようなコーディングが見つかりました。 public static class Commands { static Commands() { CloseCardCommand = new Command("CloseCard"); AddCardCommand = new Command("AddCard"); } public static Command CloseCardCommand { get; private set; } public static Command AddCardCommand { get; private set; } } このコーディングで、どのような処理をしているかも分かりません。 必要とする側の分類子の操作とは、Commandsでしょうか? 必要とされる側の分類子とは、CloseCardCommandとAddCardCommandでしょうか? 《create》(生成)の場合、どのようなコーディングになるのでしょうか? コンストラクタで CloseCardCommand = new Command("CloseCard"); AddCardCommand = new Command("AddCard"); と書くのではなく、クラス内(コンストラクタやメソッドの外)に書くのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • クラスのインスタンス作成について

    以下のようなクラス(単純化しています)とテスト関数内でインスタンス生成しています。どちらも意味は同じですが、(1)はtest関数を抜けると勝手に消滅(デストラクタ)してくれますが、(2)はdeleteを使わないと消滅しません。 (2)の方が面倒くさい(new, delete)ですが、(2)を使わないといけない場面や理由が想像できません。クラスの配列なら意味がある???と思いますが、1つのインスタンスで(2)にする場合どんな利点があるのでしょうか? class A { }; void test{ A a; -----> (1) A *pa = new A; -+ (2) delete pa; -+ } あと、A::TEISU = 1とクラスのグローバル定数を設定したいのですがどうすればよいのでしょうか?

  • 外部ファイルのクラスのインスタンスが生成できない

    いつもお世話になっております。 PHP(Ver5.2)が利用できるレンタルサーバーを借りていろいろやっているのですが、 include_once した外部PHPファイルの中のクラス定義のコンストラクタがCallされません。 //外部クラスの記述 class A{ public function __construct(){ echo "OK"; } } //メインPHPの記述 include_once "xxx.php"; $obj = new A(); ↑におけるメインPHPをブラウザから呼び出したとき、本来なら OK とechoされるはずなのに、何も表示されません。 また、クラスAに定義したpublicなfunctionをCallしようとすると、定義されてないメソッドをCallした、とエラーになります。(インスタンス自体が生成されていない??) ファイル自体は正常にIncludeされていると思います。(ファイル名を間違ったらエラーになったから) ちなみに、クラスAの記述をメインPHPに記述すると、正常に動きます。 外部ファイルのクラスを正常に動かすにあたって、何かphp.iniあたりの編集が必要なのでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • インスタンス変数の特殊な参照

    次のようなクラスを考えたときに(特に意味があるものではないですが) class A{ int a; A(){ a = 10; B b = new B(); } } class B{ int b; B(){ b = 20; C c = new C(); } } class C{ int c; C(){ c = 20; } } Cのコンストラクタの中から、Aのインスタンス変数aやBでのbの値を 参照することって出来ないのでしょうか? 変数をクラス変数にする、引数として渡す以外の方法を探しています。

  • 内部クラスから別の内部クラスのインスタンスを取得するには

    早速ではございますが質問をさせていただきます。 以下のクラスで、 ////////////////////////////////////////////////// class A { class B {} class C {} } ////////////////////////////////////////////////// 内部クラスB内で内部クラスCのインスタンスを取得するに はどうすればよいのでしょうか?どうかご教授のほど よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう