Hatena::ブログ(Diary)

放浪するエンジニアの覚え書き このページをアンテナに追加 RSSフィード

2009-01-25

Metadataのサンプル

| 06:36 |  Metadataのサンプル - 放浪するエンジニアの覚え書き のブックマークコメント

以前に一度、Java5の仕様評価をしたとき、先のログ(「Metadataとは」)で書いた「Dynamicな利用」は、煩雑さが先に立ってしまっている印象を受けた。

Javaでは、「なんで、こんな仕様が??」ということがしばしばあって、Log4Jというデファクトスタンダードに対抗するように、1.4でloggingの機構が用意されたのは有名。

アノテーションについては、XDocletになんで対抗するんだろ、との印象がぬぐえなかった。

以下、Java5で標準として用意されたAnnotationについてサンプリングする。

Java5では、以下の6種類のAnnotationが標準で用意された(自作することも可能)。

Annotation意味
Deprecated(将来的になくなるため)非推奨とする、ということを意味する
Overrideスーパークラスのメソッドをオーバーライドしている、と宣言する
Inheritedサブクラスにもアノテーションを引き継ぐ
Retensionアノテーションの利用方法(SOURCE、RUNTIME)を規定する
Targetアノテーションの対象(クラス、メソッドなど)を規定する
DocumentedJavadocでアノテーションを表記するようにする

このうち、プログラムコードそのものに関係するのは、DeprecatedとOverrideの2種類。

以下に、この2種類に関するサンプルプログラムを示す。


Deprecatedのサンプル

Deprecatedは、「このメソッドは、もう(他人に)使わせたくない」という場合に有用。

package test;

/**
 * Metadataのサンプル1
 * (Deprecated)
 */
public class ExampleMetadata1 {
    
    public String overrided(int i, String _str){
        return _str;
    }

    // (A) 非推奨メソッドの定義
    @Deprecated
    public void deplicatedMethod(){
        System.out.println("This method is deprecated!!");
        }

}

この例では、(A)でdeplicatedMethod()メソッドを非推奨としている。

Java5のアノテーションは、(Javadocコメントの中ではなく)コードの中にそのまま@付きで書き込む。

Eclipseでこのコードを書くと、メソッド名に取り消し線が表示される。

f:id:tetsuya_odaka:20090106112230p:image


Overrideのサンプル

上で用いたサンプルを使って以下のプログラムを作成する。

Overrideは、「オーバーライド(上書き)をしたつもりが、やりそこねている」というミスを防止するために有用。

package test;

/**
 * Metadataのサンプル2
 * (Override)
 */
public class ExampleMetadata2 extends ExampleMetadata1{
    
    public static void main(String[] args) {
        ExampleMetadata1 _em = new ExampleMetadata1();
        _em.deplicatedMethod(); // (a) 非推奨メソッドの利用
    }

    // (b) 正しくOverrideしている。
    @Override
    public String overrided(int i, String _str){
        return _str;
    }

    // (c) Overrideしているつもりが、Overloadしている。
    @Override
    public String overrided(String _str){
        return _str;
    }
}

(A)では、スーパークラスExampleMetadata1で、@Deprecatedとなっているメソッドを利用している。

Eclipseでは、(デフォルトの設定でコンパイル時の)警告となり、deplicatedMethodに取り消し線が入る(下図)。

(C)が、@Overrideで検出したいミス。

これはコンパイルエラーとなる。

f:id:tetsuya_odaka:20090106114457p:image