![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
http://yukimura1227.blog.fc2.com/blog-entry-49.h …
上記ページにSpringを使用したサンプルプログラムがあり試しに動かしてみたのですが
疑問に思ったことがあるので質問させてください。main()関数の中に
SearchGoodsService searchGoodsService = appContext.getBean(SearchGoodsService.class);
という記述があり戻り値の型はSearchGoodsService(インターフェース)となっています。
ここをインターフェースではなく実装クラスのSearchGoodsServiceImpl
ではダメなのでしょうか。
上記ページの下部の方に
「インターフェースを使うのはSearchGoodsServiceImplにプログラムが依存しないようにするためで、
SearchGoodsServiceImplがどう変わろうが、変更の必要がない」
という趣旨の記述があります。
ここで1つ疑問なのですが 戻り値の型が実装クラスの型であっても
SearchGoodsServiceImplがどう変更(メソッドが増えたり、減ったり)しても影響がないと思います。
また、戻り値の型がインターフェースであたとしてもSearchGoodsServiceという
インターフェース名の変更があった場合、呼び出し元の
全てのプログラムを修正しなくてはならないと思いますがいかがでしょうか。
No.3ベストアンサー
- 回答日時:
> 呼び出し元を変更せずにこれらのexecuteService()を
> 呼び出すように変更したいとなったときにはどうすればよいのか
/spring/conf/applicationContext.xmlを修正する。
Spring以外なら、Factoryメソッドを修正する。
No.2
- 回答日時:
メソッドが増えたり減ったり、名前が変わったりという話ではありません。
この例では実装クラスが1つしかないため、インターフェースを用いる利点がわかりにくいですが、
SearchGoodsServiceの実装クラスが増えた場合のことを考えてみてください。
呼び出し元ではSearchGoodsServiceと書いておけば、
機能拡張で新しくSearchGoodsServiceImpl2やSearchGoodsServiceImpl3も扱う必要がでてきても、
呼び出し元を修正する必要はありません。
この回答への補足
ご回答ありがとうございます。
すみません。実際に
SearchGoodsServiceImpl2やSearchGoodsServiceImpl3
を作ってみたのですが
呼び出し元を変更せずにこれらのexecuteService()を
呼び出すように変更したいとなったときにはどうすればよいのか
がイメージできないです。教えていただけますでしょうか。
No.1
- 回答日時:
> ここで1つ疑問なのですが 戻り値の型が実装クラスの型であっても
> SearchGoodsServiceImplがどう変更(メソッドが増えたり、減ったり)しても影響がないと思います。
変更する必要性があって修正しているのですから、影響は出ますよね。
> また、戻り値の型がインターフェースであたとしてもSearchGoodsServiceという
> インターフェース名の変更があった場合、呼び出し元の
> 全てのプログラムを修正しなくてはならないと思いますがいかがでしょうか。
もちろんです。そういうことをしなくていいように設計しなければなりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- HTML・CSS Google検索も終わりですか? グーグル、検索エンジンに対話型AI搭載へ 2 2023/04/08 11:50
- ソフトウェア データ入力のインターフェースについて 2 2022/09/27 09:07
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- JavaScript [再掲]指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードについて 1 2023/05/10 15:09
- Java オブジェクト指向プログラミングの実践本を紹介してください 3 2022/09/19 04:56
- システム 質問です。 仮分数はどういう状態ですか? プログラムについてです。 例えば、とあるプログラムで、アイ 1 2023/07/24 01:39
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
抽象クラスをJUNITでテストする...
-
c++でのヘッダーファイルの循環...
-
C# 「データが失なわれる可能性...
-
「ラッパークラス」の存在意義...
-
ASP.NETでの共通コードの書き方...
-
次の日本語の意味を教えて下さい
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
newしないインスタンス?実体化...
-
Visual Studioでのbmpファイル...
-
多人数のじゃんけんプログラム
-
ProgressBarが0%から動きません
-
クラスのプロパティに構造体を...
-
Javaの関数名が長い?
-
JAVA初心者です。JAVAで音を鳴...
-
ExcelVBA で文字列の特定の文字...
-
パワーポイントのVBAでテキスト...
-
なぜprotected overrideなのか
-
UMLのクラス図はmain()も含むん...
-
C++でfriendクラスにしているの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
C# 「データが失なわれる可能性...
-
「ラッパークラス」の存在意義...
-
c++でのヘッダーファイルの循環...
-
(vba)他のアプリケーションの右...
-
「継承されたメソッドの可視性...
-
「IOException は対応する try ...
-
ゲッターを使わないで変数にア...
-
JavaでのAPIの覚え方ってみさな...
-
VB DLLプロジェクトについて
-
Javaで下線
-
【C#】クラスのコンストラクタ...
-
Javaのインスタンス化の構文の...
-
委譲って何ですか?
-
ASP.NETでの共通コードの書き方...
-
オーバーライドとラッパーの違い
-
抽象クラスをJUNITでテストする...
-
JTextFieldの入力制限
-
Commons-Discovery.jarとは?
-
setTextについて
おすすめ情報