- 締切済み
同一メソッドに別の機能を持たせる
すみません、ご教示ください。 メソッドの呼び出し元には全く意識させないで、メソッドの機能を一時的に変更する方法はどのようなものがあるのでしょうか? それぞれ別機能のメソッドを定義したクラスをあらかじめ作成しておいて、都合に応じてクラスファイルを入れ替えて(クラス名は同じ)使用するのが一般的なのでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
こういう使い方をする場合、 通常ならSpringFrameworkなどのDIコンテナを使います。 環境的に無理ならば、クラスローダーの特性を利用して利用したいクラスを先にロードさせればいいでしょう。
- yoshog
- ベストアンサー率66% (6/9)
回答2の例が中途半端でしたので追伸です。 【インタフェイス、クラスの定義】 interface Hoge{ void execute(); } class HogeImpl1 implementes Hoge{ void execute(){ System.out.println("HogeImpl1です!");} } class HogeImpl2 implementes Hoge{ void execute(){ System.out.println("HogeImpl2です!"); } } 【呼び出し】 String className = "HogeImple1" 又は "HogeImpl2"; Hoge hoge = (Hoge)Class.forName(className).newInstance(); hoge.execute();
お礼
返信が遅くなりましてすみません。 ご丁寧な説明どうもありがとうございました。 重要な案として、検討させていただきます。 ※今回の場合、私どもがクラスをjarファイルで提供し、呼び出し元が(別の団体)が提供されたクラスを使用するという構造ですので、呼び出し元に記載頂いた方法による呼び出し方を実装頂くようなガイドが必要ですね。
- yoshog
- ベストアンサー率66% (6/9)
> それぞれ別機能のメソッドを定義したクラスをあらかじめ作成しておいて、都合に応じてクラスファイルを入れ替えて(クラス名は同じ)使用するのが一般的なのでしょうか? クラスファイルを入れ替えるというのは「hoge.class」というファイルを物理的に入れ替えるということですか? だとしたら、一般的ではないと思います。 ポリモーフィズムという言葉があるように、インタフェイスを定義して、そのインタフェイスを実装するクラスを動きごとに別クラスとして用意して、設定ファイルで入れ替えるというほうが一般的です。 Springもそのような思想で設計されています。 【インタフェイス、クラスの定義】 interface Hoge{…} class HogeImpl1 implementes Hoge{…} class HogeImpl2 implementes Hoge{…} 【呼び出し】 String className = "HogeImple1" 又は "HogeImpl2"; Hoge hoge = (Hoge)Class.forName(className).newInstance(); ※classNameはString文字列であらわされたクラス名(パッケージに属する場合は、パッケージを含めたフルネーム) ※ classNameを、コマンドライン引数、外部ファイル(XMLやプロパティファイル等)から動的に与えて、呼び出すクラスを切り替える
お礼
どうもありがとうございます。 動的な切替の方法について、月曜日にもう一度確認してご回答させて頂きます。またよろしくお願いいたします。
- kztk
- ベストアンサー率53% (59/110)
下のお話だと、「シミュレート」というよりもスタブですか? ならばいずれ、「メソッド本来の機能」を持つ本物のクラスに入れ替える予定なのですよね?だとしたら >それぞれ別機能のメソッドを定義したクラスをあらかじめ作成して >おいて、都合に応じてクラスファイルを入れ替えて(クラス名は >同じ)使用する で十分なのではないでしょうか。 もしもそうではなくて、必要に応じてメソッドの中身切り替えること自体が要件なのならば、ファクトリメソッド等で対応すればよいのではないかと思います。 定義ファイルはプロパティファイルが一般的だと思います。
お礼
どうもありがとうございます。 ファクトリメソッド 検討させて頂きます。
- koko_u_
- ベストアンサー率18% (459/2509)
どんな目的で「メソッドの機能を一時的に変更する」のかを補足にどうぞ。
補足
説明を補足させて頂きます。 目的は機能をシミュレートするためです。 メソッド本来の機能 ⇒別プロセスとソケット通信をして、相手側から応答データをもらい、もらった応答データをメソッドの戻り値として返す。 シミュレートしたい機能 ⇒定義ファイルに応答データを定義しておいて、読み込んだ応答データを戻り値として返す。 ※追加で申し訳ありませんが、定義ファイルとはjavaではプロパティファイルに書くのが一般的なのでしょうか。。(定義変更しても、コンパイルの必要が無い仕組み)
補足
お返事遅くなりましてすみません。 どうもありがとうございます。 クラスローダーの特性について理解が乏しくて申し訳ありません。 クラス側、クラスを呼び出す側双方で、どういった実装が必要なのか、また実際にロード、アンロードはどうやって実行するのか、ご教示いただけたら助かります。 宜しくお願いいたします。