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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

5570閲覧

@Resourceとnewによるインスタンス生成の違い

NiNe9

総合スコア5

Java

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

1グッド

3クリップ

投稿2019/10/23 12:46

編集2019/10/23 20:49

プログラムを作成していて、以下の2つのソースコードのような
Resourceアノテーションを使用した場合と、インスタンス生成をした場合とで違いがあるのか気になり
今回質問させていただきました。

java

1@Service 2public class ServiceA{ 3 public void test1(){ 4 // 何らかの処理 5 } 6}

java

1@Service 2public class ServiceB{ 3 @Resource 4 private ServiceA serviceA; 5 6 public function test2(){ 7 8 serviceA.test1(); //① @Resourceを利用したメソッドへのアクセス 9 10 ServiceA sA = new ServiceA(); 11 sA.test1(); //② インスタンス生成後メソッドへのアクセス 12 13 } 14}

ServiceBにある注釈①と注釈②の処理は、結局同じ結果になると認識しており
同じ結果になるのであれば
「2つの方法を使いわける明確な基準というのはあるのだろうか(この場合は、@Resourceを使った方がいい等)」
とふと思いました。

そこで、@Resourceを使用したメソッドへのアクセス、インスタンス生成後のメソッドへのアクセス
それぞれにメリット・デメリットがあるのではと思い調査してみましたが
ピンとくるような答えを得られなかったので、今回質問させていただきました。。

調査を踏まえた私なりの見解では

  • @Resourceを使用したケース
区分メリットデメリット
@Resourceを使用したケースnewをする手間が省ける@Resourceが定義されているクラスの内容がメモリにずっと展開されてしまう
newからインスタンスを生成したケースnewをすることで、メモリ上にクラスの内容を展開するので不必要な時にクラスの内容をメモリ上に展開しなくてすむnewしてインスタンスを生成しないとメソッドが使えない

このようなメリット・デメリットがあると考えてますが
「全然違う」や「こういうメリット・デメリットがある」等のアドバイスをいただけると幸いです。

色々と勉強不足で恐縮ですが、よろしくお願い致します。

kyoya0819👍を押しています

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

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

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

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

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

Zuishin

2019/10/23 13:23

行数増えてますが。
guest

回答1

0

ベストアンサー

ご質問への直接的な回答と成り得るかどうか心配ですが、回答を試みてみます。

@Resourceアノテーションは、結果的に自動でnewされるという部分だけを見るとご質問が出てもおかしくないのかもしれませんが、意味的に使う用途が異なる、との認識でいます。(少なくとも私個人的には)
つまり、アプリケーション内で永続的に存在するようなリソースオブジェクトを、「プログラマー」が明示的にソースコード上で意味付けすることで、「コンパイラー」が必要に応じてnewをし、便宜を図るためのような。

Java8 - javax.annotation 注釈型Resource
(関係無いですが、"注釈型Resource"は訳し過ぎだろう、"Resourceアノテーション"でいいですよね)
Java EE アノテーションと依存性注入の使用

例えばJavaサーブレットではうまくこれを利用していると思います。teratailでも過去、関連する質問回答がありました。
teratail#58115 - @Resourceアノテーションの使い方について

こちらでの回答で紹介されているWEBの記事14. Servlet2.5 アノテーション | TECHSCORE(テックスコア)では、Javaサーブレットのコードで使う@Resourceについて言及されています。2007年と記事が若干古く、「アノテーションでの振舞いはServlet2.5仕様で規定」との記載もあり、最新のJavaの事情と少し異なる内容もあるかもしれませんが、目的、用途としては同等だと思っています。

従って、そもそも「使用するクラス全てに@Resourceを付ければ、ソースコード中にnewは必要なくなりソースコードの行数も減る」ための用途で使うべきものでは無いのではないでしょうか。むやみやたらにクラスに@Resourceアノテーションをつけることは、それぞれのクラスオブジェクトのライフサイクルについて、プログラマーが管理を放棄したも同然だと思います。

反対に@Resourceアノテーションの目的を踏まえ、正しい用途で使う限り、質問者さんが「@Resourceを使用したケース」の表中に挙げた「デメリット」は、アプリケーションのライフサイクルにおいて大きな影響をおよぼすようなデメリットとはならず、またそれが結論になると考えます。

上記回答も質問者さんにとって「ピンとくるような答え」ではないかもしれませんが。

投稿2019/10/23 16:51

編集2019/10/23 16:57
dodox86

総合スコア9183

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

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

dodox86

2019/10/23 17:12 編集

質問文中、 > 「Resourceアノテーションを使用した場合と、インスタンス生成をした場合とで違いがあるのか気になり」 もっとシンプルに技術的な点、例えば「Javaバイトコードレベルで違いはあるのか。」などの疑問も暗に含んでいるのかな、とも思いました。その場合はやはり私自身がご質問の意図を取り違えているので、私の回答への指摘も含め、他回答者さまらの回答も期待します。
NiNe9

2019/10/23 21:02

dodox86様 回答にお時間を割いていただきありがとうございました。 また、色々と意図を汲んでいただきありがとうございます。(私の質問文に意味深なところがあって申し訳ないです。。) 一番気になっているのは、同じ結果になるとしても@Resourceとインスタンス生成の2つの方法を使いわける明確な基準・ルールというのはあるのではないかと思い、調べても1人では打開出来なかったのでこちらのサイトを使用させていただきました。 (質問文もわかりずらいと思い編集しました。) @Resourceのメリットとデメリットに関するご回答は、とてもためになりました。 もう少しだけ様子を見てベストアンサーを決めさせていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問