質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1505閲覧

javaでの依存性の注入(spring bootを使わない場合)

macaroni323

総合スコア31

DI (Dependence Injection)

DI (Dependence Injection)は、「依存性の注入」という概念を指します。オブジェクト間で依存性のあるコードを外部の設定ファイルから注入するソフトウェアパターン設計思想です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/10/29 21:19

編集2021/10/30 10:55

お世話になっております。依存性の注入を行いたいのですが、混乱してしまいました。
以下の通りクラスとインターフェースがある場合、sampleAでしていることは依存性の注入にはならないのでしょうか。
もしそうでない場合、どのようにしたら依存性の注入が可能かをお伺いしたいです。

java

1class sampleA{ 2 3public static void main( String[] args ) { 4sampleC samplec = new sampleC(); 5samplec.bMethod(hours, minutes); 6} 7} 8

java

1public interface B { 2 String bMethod(int hours, int minutes); 3}

Java

1public class sampleC implements sampleB { 2 @Override 3 public String bMethod(int hours, int minutes) { 4     (略) 5 } 6}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/10/30 03:28

「クラスA」なるモノは見当たりませんが。
jimbe

2021/10/30 03:34

「依存性の注入」の前に、 >public sampleC(sampleC samplec){ のような意味不明なコードが出来てしまう状況が問題に思います。
macaroni323

2021/10/30 08:52

ご回答いただきありがとうございます。編集いたしました。
jimbe

2021/10/30 10:50

sampleA はコンパイルできなさそうですけど・・・。 メソッド内としても、単にオブジェクトを作ってメソッドを呼んでいるだけですね。 どこからどこへ何の「依存性の注入」を行おうというのでしょうか。 そもそも「依存性」「注入」がどういうことなのかをご理解されているのでしょうか。
macaroni323

2021/10/30 11:06

>どこからどこへ何の「依存性の注入」を行おうというのでしょうか。 SampleAのmainメソッドでsampleC samplec = new sampleC();とすると、SampleAはSample Cに依存することになるので、それを回避したいのですが、 SampleAに private SampleC samplec; public SampleA(SampleC sampleC) { this.sampleC = sampleC; } と記載し、 メソッド内のsampleC samplec = new sampleC();を消した場合、 samplec.bMethod(hours, minutes);が参照できず、 private SampleC samplec;をstaticにしても実行時にSampleA.samplecがnullとなってしまいます、
jimbe

2021/10/30 11:20

> SampleAのmainメソッドでsampleC samplec = new sampleC();とすると、~ この文をご質問本文に書かれたほうがよほど具体的で分かり易いように思います。
guest

回答2

0

例に書かれているコードは依存性の注入にはなっていません。
何故なら、具象クラスを直接newすることで具象クラスsampleCに依存しているからです。
依存性の注入とは外部から依存性を与えることに他なりません。
sampleではmain関数が例なため、DIコンテナなしで依存性を注入することはできませんが、例えば以下のような例が依存性の注入となります。
以下では、sampleAにコンストラクタにより外部からsampleCの依存性を注入しています。
これが所謂コンストラクタインジェクションというものになります。
ちなみにmain関数でsampleCに依存させたくない場合の他の方法として、
sampleCを生成しintarfaceBを返すfactoryを作成して利用するという方法もあります。

class sampleA{ InterfaceB sampleC; public sampleA(InterfaceB b) { this.sampleC = b; } public void methodA() { samplec.bMethod(hours, minutes); } }

投稿2021/10/30 12:26

nicorinpana

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

つまり以下のようなことでしょうか。

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 new SampleA(new SampleC()).foo(); 4 } 5} 6 7class SampleA { 8 private SampleB sampleb; 9 public SampleA(SampleB sampleb) { 10 this.sampleb = sampleb; 11 } 12 public void foo() { 13 System.out.println(sampleb.bMethod(10, 20)); 14 } 15} 16 17interface SampleB { 18 String bMethod(int hours, int minutes); 19} 20 21class SampleC implements SampleB { 22 @Override 23 public String bMethod(int hours, int minutes) { 24 return hours+":"+minutes; 25 } 26}

投稿2021/10/30 11:18

jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macaroni323

2021/10/30 11:32

ご回答いただきありがとうございます。今現在、SampleAの中に public static void main(String[] args) throws Exception { } を記述しているのですが、Mainクラスとして分けた方が良いということでしょうか。
jimbe

2021/10/30 11:34

いえ、Main クラスが分かれているのは、テストに Paiza.IO を使ったのでそのままなだけです。 中身が合っていれば main はどこでも大丈夫だと思います。
macaroni323

2021/10/30 13:03 編集

ありがとうございます。 public class sampleA { private SampleB sampleb; public SampleA( SampleB sampleb) { this.sampleb = sampleb; } public static void main( String[] args ) throws Exception { String result = ""; String[] inputTime = args[0].split(":"); int hours = Integer.parseInt(inputTime[0]); int minutes = Integer.parseInt(inputTime[1]); new SampleA(new SampleC()); result = sampleb. bMethod(hours, minutes); System.out.println( result ); } } とした場合でも依存性の注入となりますでしょうか。
jimbe

2021/10/30 13:08

SampleA の中で new SampleC が出てこなければ注入ということになるでしょう。 ただ、このようなコードは普通に、例えば Swing のボタン等のリスナーだとかで(コンストラクタでは無いですが) やっていることですし、自作でコールバックを利用する際にも使えることですから、わざわざ「依存性」だ「注入」だと特別視するようなことでは無いように思います。
macaroni323

2021/10/30 15:10

何度も申し訳ございません、sampleA にあるmain でnew SampleA(new SampleC());とやってしまっている場合は、やはり依存性がある、ということですよね
jimbe

2021/10/30 15:53

いえいえ、SampleA の「インスタンスの中で」です。 プログラムの起点である main メソッドは上のコメントで書きましたようにどこにあっても良いものですので、カウントには入れなくて良いでしょう^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問