Javaでアノテーションはどこでどのように使用されますか? のおかげで、クラスアノテーションの目的を理解しています。説明されているように、パッケージアノテーションの目的は何ですか このブログ投稿で および Java言語仕様 の§7.4.1?
メタデータをパッケージに関連付けたいのはなぜですか?どんなことができますか?
@Deprecated
は理にかなっていると思います。また、パッケージ全体がJava以外のソースから何らかのツールによって生成された場合は、@Generated
のようなものになる可能性があります。または、このパッケージがパブリックAPIの一部でない場合は、@Internal
。
たぶん、OSGiツール(パッケージのバージョンと依存するパッケージを宣言する必要がある場合)もこれを利用できるでしょう。
野生のものを見た人はいますか?
私が考えることができる2つの理由:
たとえば、JAXBでは、型で通常使用される ほとんどの注釈 をパッケージに同様に適切に適用できます。その場合の意味は、そのパッケージ内のすべてのクラスのデフォルトを指定することです。
たとえば、getter/setterを介して公開されるパッケージ内のすべてのクラスのすべてのプロパティをXMLでマップする場合は、各クラスに@XmlAccessorType(XMLAccessType.PROPERTY)
を指定できますまたは単に指定するその包み。
これは本当の目的ではありませんが、package-info.Javaファイルの再コンパイルを回避するための回避策としてそれらを使用しています。
問題は、ドキュメント(存在する理由)と<javac>
ステートメントしかない場合、javac
(およびAntタスクpackage bla;
)がpackage-info.Javaのクラスファイルを作成しないことと、antタスクが対応する.class
ファイルがない(または古い)すべてのファイルを再コンパイルします。
そこにダミーの注釈(SuppressWarnings
など)を追加すると、package-info.class
が生成されるため、ファイルは再度変更されるまで再コンパイルされません。
(Ant 1.8.0は、注釈がない場合でも、空のpackage-info.classを作成することでこれを解決しましたが、ここでは古いant
を使用しています。)
テストメタデータ-テストパッケージ(単体テストなど)に関するメタデータです。機能、所有者、バージョン、バグ/問題など、パッケージレベルで適切なさまざまなテストメタデータを割り当てることができます。これらはクラスまたはメソッドレベルで改良できますが、パッケージレベルの定義またはデフォルトがあります。簡潔にするために便利かもしれません。私はこのアプローチの変形を利用しました(注釈の利点の前に)。
機能、所有権、欠陥、履歴情報など、同じ種類のものに関する一般化されたコードメタデータについても同様の議論を行うことができます。