概要概要
Caffeineソースコードでcheckerframeworkを見たので、次の記事があります。
<dependency>
<groupId>org.checkerframework</groupId>
<artifactId>checker-qual</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.checkerframework</groupId>
<artifactId>checker-compat-qual</artifactId>
<version>2.5.5</version>
</dependency>
前書き
公式サイト
GitHubの
達人
ザ・チェッカーフレームワーク、CFは、プラグインを書き込むことによって、Javaコンパイラの機能を拡張するためのメカニズムを提供します。数十の検査ルールが組み込まれており、検査ルールも簡単にカスタマイズできます。主にJavaのアノテーションを使用して、コンパイルプロセスの型チェックステップの機能を強化します。
インスタンス
GetStarted.javaソースコード:
import org.checkerframework.checker.nullness.qual.*;
public class GetStarted {
void sample() {
@NonNull Object ref = null;
}
}
CFが提供するjavacを使用して、実行時にチェックする必要のあるコードをコンパイルします。Linux / Macユーザーの場合、次の2行を.bashrc
またはに.zshrc
追加できます。
export CHECKER_FRAMEWORK=${install_path}/checker-framework-2.1.9
alias javacheck='$CHECKER_FRAMEWORK/checker/bin/javac'
:
javacheck -processor org.checkerframework.checker.nullness.NullnessChecker GetStarted.java
-process org.checkerframework.checker.nullness.NullnessChecker
検出するエラーがnullポインターであることを指定します。CFには、他のタイプのエラーを検出するための他の多くの便利なプラグインも付属しています。
上記のコマンドは次のように出力します。
GetStarted.java:5: 错误: [assignment.type.incompatible] incompatible types in assignment.
@NonNull Object ref = null;
^
found : null
required: @UnknownInitialization @NonNull Object
1 个错误
IDEAサポート
checker-framework-supportは
長い間更新されていません。
展開
RetentionPolicy
@ RetentionPolicy.SOURCE =>通常はドキュメントで使用されます
@ RetentionPocily.CLASS =>コンパイラに情報を提供できますが、JVMには提供できません(たとえば、コンパイル中のコード生成)
@ RetentionPolicy.RUNTIME => JVMレベルで許可(実行時に)アノテーション情報を取得します。
FindBugs
FindBugsのは、2つの実装を持つ成熟したバグの解決策である:Google Codeのとソースフォージ。としては、次の2つのスクリーンショットから見ることができ、2に含ま依存ライブラリは基本的に同じです。
また、JSR305はFindBugsの一部です。
JSR 305
JCP公式Webサイト:JSR 305、
アノテーションクラスの定義を通じて、基礎となる一般的なコードベースでの使用に適しています。GAVは次のとおりです。
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>3.0.2</version>
</dependency>
または
<dependency>
<groupId>net.sourceforge.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>1.3.7</version>
</dependency>
JSR 308
JSR 308、JCP仕様。
checkerframework-jsr308は、JSR308、Java 8型アノテーションを実装し、型チェッカーが静的コード分析を実行できるようにします。
JSR305とJSR308
私はあなたの最後の質問に答えることができます。それらは同じものではありません。305は、すでに配置できる新しい注釈に関するものであり、契約システムによる設計のプログラムによる可視性を提供するのに役立ちます。そのため、特定のメソッドがnullを返さない場合、または特定のメソッドがnullパラメーターを受け取らない場合は、アノテーションを分析するシステムに、このコードでこの特定のケースを探すように指示することができます。
308は、ジェネリックパラメーターや型キャストなど、より多くのものに注釈を付けることができるようにすることを目的としています。その主な用途は、その目的のためにローカル変数を宣言する代わりに、特定の型キャストで警告を抑制できることだと思います。@SuppressWarningsアノテーションはすでに存在しますが(JSR-305は新しいアノテーションを定義しようとします)、JSR-308ではより多くのケースに適用できます。
これによると、308はJava7の一部になります。これは、安定していることを意味します。JSR-305はリストに含まれていないため、Java7に到達するようには見えません。
比較
さまざまなアイテムが独自のNonNullアノテーションを定義します。次に例を示します。
- org.checkerframework.checker.nullness.qual.NonNull
- edu.umd.cs.findbugs.annotations.NonNull
- javax.annotation.Nonnull
- javax.validation.constraints.NotNull
- lombok.NonNull
- org.eclipse.jdt.annotation.NonNull
参照
http://shzhangji.com/cnblogs/2018/09/22/how-to-avoid-null-pointer-exception/