注釈 ご存知のとおり、この機能は Java5 以降に追加され、現在ではプログラムの構成を簡素化するために多くのフレームワークで広く使用されています。それでは、議論の的となっている型アノテーションとは一体何なのでしょうか?複雑ですか、それとも便利ですか?
1. 型アノテーションとは何ですか? Java 8 より前では、アノテーションはクラス、メソッド、属性など、宣言されている場所でのみ使用できます。次のような場所にアノテーションを適用できます。例
new @Interned MyObject();
myString = (@NonNull String) str;
implements ステートメント
class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ... }
throw 例外ステートメント
void monitorTemperature() throws @Critical TemperatureException { ... }
型アノテーションは単なる構文であり、セマンティクスではなく、Java のコンパイル時間、ロード時間、および実行時間には影響しないことに注意してください。つまり、クラス ファイルにコンパイルされるときに型アノテーションは含まれません。
2. 型アノテーションの役割
まず、次のコードを見てください。
Collections.emptyList().add("One"); int i=Integer.parseInt("hello"); System.console().readLine();
上記のコードは、実行時に、それぞれ、UnsupportedOperationException が報告されます。アノテーション Java プログラムでの強力な型チェックをサポートするために使用されます。プラグイン チェック フレームワークを使用すると、コンパイル中にランタイム エラーを検出して、コードの品質を向上させることができます。これが型アノテーションの役割です。
3. チェック フレームワーク
チェック フレームワークはサードパーティ ツールであり、Java の型アノテーションと組み合わせると、効果は 1+1>2 になります。これは、javac コンパイラに埋め込んだり、ant や maven で使用したり、Eclipse プラグインとして使用したりできます。アドレスは http://types.cs.washington.edu/checker-framework/ です。
check フレームワークは、型アノテーションが表示される場所を見つけてチェックします。 簡単な例:import checkers.nullness.quals.*; public class GetStarted { void sample() { @NonNull Object ref = new Object(); } }
javac -processor checkers.nullness.NullnessChecker GetStarted.java
@NonNull Object ref = null;
型アノテーションとチェックフレームワークを通じて、コンパイル中に実行時エラーが見つかることがわかります。
4. JSR 308 について
JSR 308 は、Java 1.5 アノテーションで発生する 2 つの問題を解決したいと考えています:
2. : 型システムはすべてのバグを防ぐことはできません。
JSR 308 は、次の方法で上記の 2 つの問題を解決します。
1. Java 言語の構文を拡張して、より多くの位置にアノテーションを表示できるようにします。含まれるもの: メソッド レシーバー (注釈: public int size() @Readonly { ... })、汎用パラメーター、配列、型変換、型テスト、オブジェクト作成、型パラメーター バインディング、クラス継承、および throws 節。実際、これは Java 8
2 の機能となった型アノテーションであり、プラグ可能な型システムを導入することで、より強力なアノテーション プロセッサを作成できます。型チェッカーは、型修飾アノテーションを含むソース コードを分析し、不一致などのエラーが見つかった場合は警告メッセージを生成します。実際、これはチェック フレームワークです
JSR308 では、より複雑で静的であると考えて反対する人もいます。たとえば、import checkers.nullness.quals.*; public class GetStarted { void sample() { /*@NonNull*/ Object ref = null; } }
@NotEmpty List<@NonNull String> strings = new ArrayList<@NonNull String>()>
誰もがこの機能を好むわけではありませんが、特に動的言語が普及している今日では、この機能に反対する人はこの機能の使用を強制されません。または、より高い品質要件を持つ企業は、JSR 308 を採用できます。結局のところ、コードは「最も基本的な」ドキュメントです。私はこの文に同意します。コードの量は増えますが、コードの表現力がさらに高まります。この機能についてどう思うかについては、誰もが独自の意見を持っています。 。
Java8 の型アノテーションの簡単な分析に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。