Java8 の型アノテーションの簡単な分析

高洛峰
リリース: 2017-01-23 15:19:10
オリジナル
1467 人が閲覧しました

注釈 ご存知のとおり、この機能は 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 を使用して上記のクラスをコンパイルします

javac -processor checkers.nullness.NullnessChecker GetStarted.java
ログイン後にコピー

コンパイルは成功しますが、次のように変更すると、

@NonNull Object ref = null;
ログイン後にコピー

必要ない場合。エラーが発生した場合、直接 javac GetStarted.java をコンパイルして渡すことは可能ですが、Java 5、6、および 7 では可能ではありません。 javac コンパイラは @ NonNull とは何かを知らないため、チェック フレームワークには下位互換性のある解決策があり、たとえば、上記の例は次のように変更されます。

このように、javac コンパイラはコメント ブロックを無視しますが、チェック フレームワークの javac コンパイラを使用して非 null エラーも検出できます。

型アノテーションとチェックフレームワークを通じて、コンパイル中に実行時エラーが見つかることがわかります。

4. JSR 308 について

JSR 308 は、Java 1.5 アノテーションで発生する 2 つの問題を解決したいと考えています:

1. アノテーションは宣言された場所でのみ記述できます

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>()>
ログイン後にコピー

として動的言語に置き換えられます。最終的には、コードは次のようになります。 「最も基本的な」文書。コードに含まれる注釈は、コードを書いた人の意図を明確に示します。更新が間に合わなかったり、漏れがあった場合、他の文書で失われる可能性が最も高いのは、まさに注釈に含まれる意図した情報です。さらに、実行時エラーをコンパイル段階に転送することで、開発プロセスをスピードアップできるだけでなく、テスト中のバグのチェックにかかる時間を節約することもできます。

5. 概要


誰もがこの機能を好むわけではありませんが、特に動的言語が普及している今日では、この機能に反対する人はこの機能の使用を強制されません。または、より高い品質要件を持つ企業は、JSR 308 を採用できます。結局のところ、コードは「最も基本的な」ドキュメントです。私はこの文に同意します。コードの量は増えますが、コードの表現力がさらに高まります。この機能についてどう思うかについては、誰もが独自の意見を持っています。 。

Java8 の型アノテーションの簡単な分析に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート