LoginSignup
1
3

More than 5 years have passed since last update.

【社内勉強会】Javaアノテーションの基礎(2017/11/02) ~作成中~

Last updated at Posted at 2017-11-01
1 / 19

0. はじめに


内容

  • アノテーションの基礎。

前提知識

  • Javaの基本構文
  • Javaのアノテーションの使い方

参考図書

image

『Effective Java 第2版』丸善出版


目次

  1. アノテーションのメリット
  2. 自作アノテーション
  3. JUnit、lombokの中身を見る

1. アノテーションのメリット


Javaのアノテーションの概要

アノテーション(英語:annotation)とは、あるデータに対して関連する情報(メタデータ)を注釈として付与すること。

アノテーション - Wikipedia 引用

  • Java5から導入された(2004年リリース)

アノテーションの例(JUnit4)

CalculationTest.java
public class CalculationTest {
    /** テストケース1 */
    @Test
    public void sampleTest1() {
        //...
    }
    /** テストケース2 */
    @Test
    public void sampleTest2() {
        //...
    }    
}
  • テストケースであることを@Testで表す
  • JUnitのRunnerは、@Testが付与されたメソッドのみ実行する
  • アノテーションはJUnit4から導入された

もしもJUnitでアノテーションが使えなかったら(JUnit3)

CalculationTest.java
public class CalculationTest extends TestCase{
    /** テストケース1 */
    public void testSample1() {
        //...
    }
    /** テストケース2 */
    public void testSample2() {
        //...
    }    
}
  • テストクラスであることを、TestCaseの継承で表す
  • テストケースになるメソッド名は、testから始まる
    ⇒命名パターン

http://d.hatena.ne.jp/smada564/20110501/1304265351 参考


命名パターンの短所

誤字に気づかない

  • メソッドが名がtsetSample2の場合(誤字)、実行されないだけ。エラーが出ない

パラメータ値を紐づけられない

たとえば、IllegalArgumentExceptionをスローすることを期待するテストメソッドを考える。

/** JUnit4の書き方 */
@Test(expected = IllegalArgumentException.class)
public void sample() {
    //...
}

/** アノテーションが使えない場合の例 */
public void test_IllegalArgumentException_sample() {
    //...
}    
  • 醜く、脆弱
  • Exceptionが存在しているかかどうかを、コンパイルは判断できない
    • 実行するまで気づかない

※『Effective Java第2版』項目35 参考


XMLとアノテーションの比較

Servletは、アノテーションとXMLどちらでも設定できる。

@WebServlet("/Hello")
public class HelloServlet extends HttpServlet {
  //...
}
web.xml
<!-- アノテーションを使わない場合は、XMLで指定 -->
<servlet>
  <servlet-name>Hello</servlet-name>
  <servlet-class>jp.co.sample.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>Hello</servlet-name>
  <url-pattern>/Hello</url-pattern>
</servlet-mapping>

XMLと比較したアノテーションの特徴

  • 記述量が少ない
  • 一つのファイルで完結している
  • クラス名やメソッド名を変更しても、アノテーションの修正は不要

ソースの変更に強い

Annotations vs XML, advantages and disadvantages 参考


標準ライブラリのアノテーション


@Override

オーバライドしているメソッドであることを表すアノテーション。

Book.java
public class Book {
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }
    String title;
    String author;

    @Override //Compile Error. 正しくは equals(Object obj)
    public boolean equals(Book obj) {
        //nullチェックは省略
        return title.equals(obj.title) && author.equals(obj.author);
    }

}

コンパイル時に、オーバライドできていない(オーバロードしている)ことに気づける。

※『Effective Java第2版』項目36 参考
【Effective Java】項目36:常に Override アノテーションを利用する 参考


@Deprecated

Java9から@Deprecated(since="9", forRemoval=true)という書き方ができるようになった

  • 廃止予定なのか?(forRemoval)
  • いつ廃止するのか?(since)

What’s New for Core Libraries in JDK 参考


@SuppressWarnings

IDEに警告メッセージを抑制させる。

@SuppressWarnings( "unchecked" ) //型のチェックに関する警告を除外
@SuppressWarnings( "javadoc" ) //JavaDoc警告の除外
public class Book {
    //..
}

http://capm-network.com/?tag=Java-%E3%82%A2%E3%83%8E%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3 参照


value属性


付録


標準アノテーション


参考サイト

http://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-MA14-Architect-TypeAnnotations.pdf
http://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-MA16-Annotations.pdf

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3