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

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

新規登録して質問してみよう
ただいま回答率
85.40%
Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

1回答

380閲覧

Spring Boot 呼び出し元クラスのメソッドを使用する方法がわかりません。

hanahanahana

総合スコア3

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2024/06/13 06:45

実現したいこと

呼び出し元クラスのpublicメソッドを、呼び出し先で使用したいです。
※スレッドセーフにしたいため、newはしない方針でコードを書いています。

発生している問題・分からないこと

Service1.main()の中で、呼び出し元であるComponent1のhoge()を使用したいです。

該当のソースコード

Java

1@Component 2public class Component1 { 3 private final Service1 service1; 4 public void component1() { 5 service1.main(); 6 } 7 8 public void hoge() { 9 System.out.println("test"); 10 } 11}

Java

1@Service 2public class Service1 { 3 public void main() { 4 // ここでComponent1.hoge()を使用したいです。 5 } 6}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ダメ元で下記方法でやってみましたが、駄目でした…

@Service
public class Service1 {
private final Component1 component1;
public void main() {
component1.hoge(); // ApplicationContextエラーとなってしまいます。
}
}

補足

特になし

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

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

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

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

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

jimbe

2024/06/13 14:40

単に java として考えるなら、 main メソッドの引数として Component1 オブジェクトを貰えば良いのでは。
hanahanahana

2024/06/17 00:00

コメント下さり、ありがとうございます。 newしてインスタンス化して渡す、ということでしょうか? newせずにできないものかなと思っておりまして…
hanahanahana

2024/06/17 00:03

※質問文のソースコードには記述し忘れてしまっていたのですが、 @RequiredArgsConstructor を使用しています。
jimbe

2024/06/17 17:53 編集

new は全く必要ありません、というより普通は new しないでしょう。 (ちなみに「※スレッドセーフにしたいため、newはしない」とありますがスレッドセーフと new する/しないも普通は関係ありません。) 文字通り「main メソッドの引数として Component1 オブジェクトを貰う」だけです。深読みは必要ありません。
kiino

2024/06/19 18:04

「ダメ元でやった」ときに出力されたエラー文をそのまま教えてもらうことはできますでしょうか
guest

回答1

0

Component1 クラスの component1 メソッドで

service1.main(this);

と自分を渡すようにし、 Service1 クラスの main メソッドの定義を

public void main(Component1 component1) {

とすれば、 main メソッド内で

component1.hoge();

と出来ます。

試しに普通の java アプリケーションとして同じ形を作ってみます。(@RequiredArgsConstructor を使わないため Component1 にコンストラクタを追加しています。)

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 Service1 s = new Service1(); 4 Component1 c = new Component1(s); 5 c.component1(); 6 } 7} 8 9class Component1 { 10 private final Service1 service1; 11 Component1(Service1 service1) { 12 this.service1 = service1; 13 } 14 public void component1() { 15 service1.main(this); 16 } 17 18 public void hoge() { 19 System.out.println("test"); 20 } 21} 22 23class Service1 { 24 public void main(Component1 component1) { 25 component1.hoge(); 26 } 27}

実行結果 (paiza.io)

test

投稿2024/06/17 03:29

編集2024/06/17 03:37
jimbe

総合スコア13045

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

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

hanahanahana

2024/06/19 00:46

ご回答くださりありがとうございます。 疑問点が解決しました。 (また、スレッドセーフやnewに関しての理解ができておらずすみませんでした…) ベストアンサーに選ばせていただきました!
jimbe

2024/06/19 05:24 編集

お疲れさまでした。 時々、オブジェクト(の機能)が使いたくなったら何でもその都度 new して作れば良いという理解になってしまっている方がいらっしゃいます。 何が原因なのか (誤解し易い説明をしている人/書籍/ネットの情報があるのか) 分かりませんが、オブジェクトはただの機能ではありません。オブジェクトは「データを保持しそのデータと共に機能するモノ」です。しかも同じデータを持つオブジェクトを簡単に何度も作れるとは限りません。 一般的にオブジェクトが違えば保持しているデータも違う可能性があり、そうなれば同じ機能を呼び出しても結果が違ってしまうので、ちゃんと『何かの時点で必要なデータを持っているオブジェクトを別の時点で使うためには、いつどう渡せば良いのか』を考える必要があります。(時にはオブジェクトのデータが後から変えられてしまうこともあるので、『貰ったからもう何も考えなくても大丈夫』な訳でもありませんが…。) Component1 の引数の無い component1 メソッド (紛らわしいので別の名前の方が良かったですね^^;) で Service1 オブジェクトを使うために Component1 クラスのコンストラクタで Service1 オブジェクトを貰ってフィールドに保存しているのも、ちゃんと意味があるのです。 >ベストアンサーに選ばせていただきました ベストアンサーボタンを押されていないようですが…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問