注釈 ご存知のとおり、この機能は Java5 以降に追加され、現在ではプログラムの構成を簡素化するために多くのフレームワークで広く使用されています。それでは、議論の的となっている型アノテーションとは一体何なのでしょうか?複雑ですか、それとも便利ですか?
1. 型アノテーションとは何ですか?
Java 8 より前では、アノテーションはクラス、メソッド、プロパティなど、宣言された場所でのみ使用できましたが、Java 8 では、次のようにどこにでもアノテーションを適用できます。
クラスインスタンスの作成
次のようにコードをコピーします。 new @Interned MyObject();
型マッピング
次のようにコードをコピーします。 myString = (@NonNull String) str;
ステートメントを実装します
次のようにコードをコピーします。 class UnmodifiableList<T>implements @Readonly List<@Readonly T> { ... }
例外ステートメントをスローする
次のようにコードをコピーします。 voidmonitorTemperature() throws @CriticalTemperatureException { ... }
型アノテーションは単なる構文であり、セマンティクスではなく、Java のコンパイル時間、ロード時間、および実行時間には影響しないことに注意してください。つまり、型アノテーションはクラス ファイルにコンパイルされるときに含まれません。
2. 型アノテーションの役割
まず次のコードを見てください。
次のようにコードをコピーします。
Collections.emptyList().add("1");
int i=Integer.parseInt("hello");
System.console().readLine();
上記のコードは正常にコンパイルされますが、実行時に UnsupportedOperationException; NullPointerException が報告されます。
型アノテーションは、Java プログラムでの強力な型チェックをサポートするために使用されます。プラグイン チェック フレームワークを使用すると、コンパイル中にランタイム エラーを検出して、コードの品質を向上させることができます。これが型アノテーションの役割です。
3. フレームワークを確認する
Check Framework はサードパーティ ツールであり、Java の型アノテーションを使用する効果は 1+1>2 です。 javac コンパイラに埋め込んだり、ant や maven で使用したり、Eclipse プラグインとして使用したりできます。アドレスは http://types.cs.washington.edu/checker-framework/ です。
チェック フレームワークは、型アノテーションが表示される場所を見つけてチェックします。簡単な例を次に示します。
次のようにコードをコピーします。
checkers.nullness.quals.* をインポートします。
パブリック クラス GetStarted {
void サンプル() {
@NonNull オブジェクト ref = new Object();
}
}
javac を使用して上記のクラスをコンパイルします
次のようにコードをコピーします。
javac -processor checkers.nullness.NullnessChecker GetStarted.java
コンパイルは成功しますが、次のように変更された場合:
次のようにコードをコピーします。
@NonNull オブジェクト参照 = null;
エラーを検出するために型アノテーションを使用したくない場合は、直接 javac GetStarted.java をコンパイルして渡すことができますが、型アノテーションをサポートするバージョンでは実行できません。 Java 5、6、および 7 のバージョンでは、javac コンパイラーは @NonNull が何であるかを認識しませんが、チェック フレームワークには下位互換性のある解決策があり、非 null の型注釈に /**/ を付けます。
たとえば、上記の例は次のように変更されます。
次のようにコードをコピーします。
checkers.nullness.quals.* をインポートします。
パブリック クラス GetStarted {
void サンプル() {
/*@NonNull*/ オブジェクト参照 = null;
}
}
この方法では、javac コンパイラはコメント ブロックを無視しますが、チェック フレームワークの javac コンパイラは null 以外のエラーも検出できます。
型アノテーションとチェック フレームワークを通じて、ランタイム エラーがコンパイル時に検出できるようになったことがわかります。
4. JSR308について
JSR 308 は、Java 1.5 アノテーションで発生する 2 つの問題に対処することを目指しています。
1. アノテーションの構文上の制限: アノテーションは、宣言されている場所にのみ記述できます。
2. 型システムの意味上の制限: 型システムはすべてのバグを防ぐことはできません。
JSR 308 は、次の方法で上記の 2 つの問題を解決します。
1. Java 言語の構文を拡張して、より多くの位置に注釈を表示できるようにします。含まれるもの: メソッド レシーバー、ジェネリック パラメーター、配列、型変換、型テスト、オブジェクトの作成、型パラメーターのバインド、クラスの継承、および throws 節。実際、これは Java 8 の機能となった型アノテーションです。
2. プラグ可能なタイプ システムを導入することで、より強力な注釈プロセッサを作成できます。型チェッカーは、型修飾アノテーションを含むソース コードを分析し、不一致などのエラーが見つかった場合は警告メッセージを生成します。実はチェックフレームワークです
JSR308 はより複雑で静的であると考えて、JSR308 に反対する人もいます。
次のようにコードをコピーします: @NotEmpty List<@NonNull String> strings = new ArrayList<@NonNull String>()>
次のように動的言語に変更します
次のようにコードをコピーします。 var strings = ["one", "two"];
最終的にはコードが「最も基本的な」文書であることに同意する人もいます。コードに含まれる注釈は、コードを書いた人の意図を明確に示します。更新が間に合わなかったり、漏れがあった場合、他の文書で失われる可能性が最も高いのは、まさに注釈に含まれる意図した情報です。さらに、実行時エラーをコンパイル段階に転送することで、開発プロセスをスピードアップできるだけでなく、テスト中のバグのチェック時間を節約することもできます。
5. まとめ
特に動的言語の人気が高まっている現在では、誰もがこの機能を好むわけではありません。幸いなことに、Java 8 はすべての人にこの機能の使用を強制するわけではありませんが、コードの品質に対してより高い要件を持っている一部の人には使用できません。会社は JSR 308 を採用できます。結局のところ、コードは「最も基本的な」ドキュメントです。私はこの文に同意します。コードの量は増えますが、コードの表現力がさらに高まります。この機能についてどう思うかについては、誰もが独自の意見を持っています。 。