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

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

ただいまの
回答率

90.76%

  • Java

    13162questions

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

  • アノテーション

    9questions

    アノテーションとは、特定のコードに対して、メタデータを注釈として付与することを指します。また、付与したメタデータ自体をアノテーションと呼ぶ場合もあります。

  • リフレクション

    6questions

    リフレクションとは、プログラムの実行過程でプログラム自身の構造を読み取り、編集する事が出来るプロセスのことを指します

アノテーションはどのような場合に自作するか

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 206

lupus_dingo

score 251

お世話になっております。

Java関連の書籍を読んでいると以下のような事が書いてあります。
「アノテーションはそれ自身がなにかを行うのではなく、プログラムに対するメタデータの付与として利用する」

この意味は、動作には影響は与えないが、このメソッドやフィールドはこういう物ですよ、という情報を付与する(ただの情報なのでoverrideのように必須ではない)というように読み取れます。

しかしspringフレームワークのautowiredやjunitのrunwithのように動作に影響を与えている(むしろないと動かない)物もあります。
なのでちょっと府に落ちません。

そもそもアノテーションはどのような場合に実装されるものなのでしょうか?またアノテーションで実装した方がいい場合などもあるのでしょうか?

今までアノテーションを実装するような事がなかったので疑問に思っています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

そもそもアノテーションはどのような場合に実装されるものなのでしょうか?

何らかの汎用的な枠組み(=フレームワーク)を提供したいとき、同フレームワークへの指示を与える目的で アノテーション(Annotation) が利用されることが多いです。質問文で挙げられている Spring や JUnit といったフレームワークは、まさにこの用途でアノテーションを利用しています。

またアノテーションで実装した方がいい場合などもあるのでしょうか?

どのような機能をアノテーションとして実装するかは、フレームワークの設計思想次第なところが大きいと思います。一般的には、アプリケーションの具体的な処理ロジックとは直接関係しない、フレームワーク上での共通的な振る舞いを表現するために利用されます。

Springの@AutowiredやJUnitの@Runwithは、まさに後者「そのフレームワークを使うに当たって共通的なプログラムの振る舞い」を表現しています。(コンポーネント間の依存性解決、単体テストの実行指示)


「アノテーションはそれ自身がなにかを行うのではなく、プログラムに対するメタデータの付与として利用する」
この意味は、動作には影響は与えないが、このメソッドやフィールドはこういう物ですよ、という情報を付与する(ただの情報なのでoverrideのように必須ではない)というように読み取れます。
しかしspringフレームワークのautowiredやjunitのrunwithのように動作に影響を与えている(むしろないと動かない)物もあります。

ここで言う アノテーション=メタデータ とは、「プログラミング言語Javaの言語仕様としては直接解釈しない付加情報(メタデータ)ですよ」という解釈が妥当です。あるアノテーションの 意味 を定義するのは、そのアノテーションを定義しているフレームワークの役割です。フレームワークは、実行時にユーザコードにつけられたアノテーションを取得・解釈し、フレームワーク自らが決めた動作仕様に従って処理します。

@Overrideアノテーションなどの“事前定義アノテーション”はJavaコンパイラが解釈・処理するため、Java言語仕様と密接な関係にあります。これらのアノテーションは特別扱いした方がよいかもしれませんね...)

Oracle/Java公式ドキュメントの Annotations も参照ください(英語)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/04 19:00

    回答ありがとうございます。
    勉強になりました。
    メソッドの内容とは関係ないけど実現したいこと、たとえば

    ・メソッド開始前と終了後にログを出力したい
    ・ログインしてる場合のみメソッドを実行したい
    などは、処理を外だししてしまえばコードはすっきりするけどそれをアノテーションで実現するかは設計次第という感じでしょうか。

    あと、動作に影響しているアノテーションの方が確かに多いと思うのでoverrideは特殊なんですね。

    キャンセル

  • 2018/05/04 20:45 編集

    アノテーションはいわゆる AOP(Aspect Oriented Programming; アスペクト指向プログラミング) のために利用されることが多いと思います。上記コメントで言及されている振る舞い(ログ出力、ログイン確認)は、まさにAOP向けの典型例として紹介される処理ですね。

    キャンセル

  • 2018/05/06 11:17

    ありがとうございます。
    参考になりました。

    キャンセル

+1

前半の方についてコメントしてみます。

動作には影響は与えないが、このメソッドやフィールドはこういう物ですよ、という情報を付与する

アノテーション自体は確かにクラスやメンバー(フィールドやメソッド)や引数などに、「Javaの言語仕様でサポートされていないような意味付け(メタな情報)のマーク」を付けるためのものですが、コンパイル時にアノテーションプロセッサーを使って、あるいは実行時にリフレクションを使ってそのマークを検出して色々なことが行えるような仕組みが備わっているため、そのようなプログラムを併用すると「動作に影響を与えることもできる」ものです。

そうしたものを何も使わなければおっしゃるとおり「ただのマーク」にしかすぎません。

アノテーションプロセッサーを活用している例ではLombokが思い浮かびます。これはgetter/setterの自動生成をしてくれたりしますが、マクロ展開っぽいこともできるという一例だと思います。言語仕様の拡張とまではいかなくても糖衣構文的なものは実現できたりするのではないでしょうか。

とはいえ、Lombokのようにアノテーションプロセッサーを使うような応用は言語処理系の専門家っぽい人がやることでアプリケーション開発者のだれでもがほいほいやるようなものではない印象です。

一方、リフレクションを用いて実行時にアノテーションをチェックし何か特別な動作をする程度であればわりと簡単にできる印象です。リフレクションを利用するため多少ミドルウェアっぽい設計をすることになりますが。


そもそもアノテーションはどのような場合に実装されるものなのでしょうか?またアノテーションで実装した方がいい場合などもあるのでしょうか?

自分はDIとかAOPという単語が思い浮かぶ程度で、コメントできるほどの知識がないです。開発に対する取り組み方もプロの方と大分違う気がしますし。

自分の場合「ちょっとこういうメタな情報を付けておこう」なんて感じで割と気軽にアノテーションを定義しますが、プロの方から見れば「自前でミドルウェアっぽいことをほいほいやってしまうなんて安直すぎる、このフレームワーク使えば済むではないか」と言われてしまう気がします...><

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/04 19:06

    回答ありがとうございます。

    使ったことありませんがLombokもアノテーションでしたね。ゲッターセッターくらいIDE使えば簡単に生成できますが、ステップ数を減らして読み易さを向上させるのが目的なんでしょうかね。
    話がそれましたがアノテーション+リフレクションにするか、通常の外だしにするかは設計次第のようですね。
    参考になりました。

    キャンセル

  • 2018/05/04 20:15 編集

    IDEでの自動生成とLombokなどの違う点はIDEで自動生成したものはリファクタリングツールが必要(ソースを改変する際にどうしても複数個所の変更をしなければならい)のに対しアノテーションプロセッサーによる方法はそういうことがないという話を聞いたことがあります。IDEにはリファクタリング機能が付いているから大した違いでないといえるのかもしれませんが・・・
    メタ情報はアノテーション以外にもXMLなどを用い外側に分離する方式もよく行われると思いますが、後者は仕組みが若干面倒なのでアノテーション+リフレクションの方が手軽かなという印象はあります。

    キャンセル

  • 2018/05/06 11:17

    ありがとうございます。
    参考になりました。

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13162questions

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

  • アノテーション

    9questions

    アノテーションとは、特定のコードに対して、メタデータを注釈として付与することを指します。また、付与したメタデータ自体をアノテーションと呼ぶ場合もあります。

  • リフレクション

    6questions

    リフレクションとは、プログラムの実行過程でプログラム自身の構造を読み取り、編集する事が出来るプロセスのことを指します