Java Gold合格へ向けて
黒本の第7章は『アノテーション』、これをさらに細分化すると下記の8つに分かれる(黒本より抜粋)。
- マーカーインタフェース
- アノテーションの定義とアノテーションに関する情報の取得
- 注釈パラメータ
- メタ・アノテーション
- @Retentionアノテーションと保持期間
- @Overrideアノテーション
- @Deprecatedアノテーション
- @SuppressWarningsアノテーション
アノテーションとはクラスやメソッドに独自の特性を指定するための機能である。変数やメソッドにおける特性とは、名前やスコープ、引数の数などを指し、アノテーションを使えばそれ以外の特性を指定することができるという訳だ。そんなアノテーション機能が実装されるに至ったキッカケが、マーカーインタフェースという「クラスごとに処理するかしないかを分岐させることができるインタフェースを用いた実装手法」である。
「とあるクラスのメソッドについて、処理の実行有無を外部で指定できるようにしたい」と考えた時、アノテーションが追加される前は、メソッドも何も持たないクラスに意味を追加することだけを目的としたインタフェースを作成し、そのインタフェースを実現したかしていないかをinstanceofメソッドを用いて判断した。実装例として、下記のようなTestインタフェースのケースを考える。
testインタフェース
public interface test { }
上記testインタフェースはメソッドも何も設定していないため、実装クラス側の制限(絶対に定義しないといけないメソッドなどは存在しない)は存在しない。とりあえず下記のようなTestImplを実装してみた。 testインタフェース実装
public class testImpl implements test{ public void execute(){ System.out.println("test実装済み"); } }
instanceofメソッドを用いてimplementsの有無に応じて処理を分岐できるように実装した。実行結果を見てもらえば分かるように、listはTestインタフェースを実装している訳ではないので処理が行われる、testは処理が行われている。 testインタフェース実装
public class Main { public static void main(String[] arg){ ArrayList list = new ArrayList(3); Test test = new TestImpl(); if (list instanceof Test) { System.out.println("list実行可能"); } if (test instanceof Test) { System.out.println("test実行可能"); } } }
testインタフェース実装
test実行可能
上記アノテーションの始まりの話は軽く覚えておくとして、第7章の内容はざっくりと下記3つに分類できると考える。
アノテーションは自分でも作成が可能となっている。その実装方法については抑えておくべきだろう。 また、それら作成したアノテーションを利用する場合などリフレクションという機能の理解が不可欠となってくる。 上記とは別に、既存でアノテーションが用意されているため、それらについても覚えておくべきだ。 とりあえず第8週はこれら3項目について重点的に記事としてまとめていきたい。