私はそれを見ることができる@Nullable
と@Nonnull
注釈ができ予防に有用であるNullPointerException
のを、彼らは非常に遠くに伝播されません。
- これらの注釈の有効性は、1レベルの間接参照の後に完全に低下するため、ほんの数個追加しただけでは、あまり伝播しません。
- これらの注釈は十分に実施されていないため、でマークされた値
@Nonnull
がnull ではないと想定し、その結果nullチェックを実行しない危険があります。
以下のコードはでマークされたパラメータが発生@Nonnull
するnull
いかなる苦情を上昇させずに。NullPointerException
実行されるとそれをスローします。
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
// this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
// this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
}
これらの注釈をより厳密に適用および/またはさらに伝播させる方法はありますか?
@Nonnull
する@Nonnull
方法は、null許容変数を持つメソッドを呼び出すときにキャストを要求することだと思います。もちろん、アノテーションを使用したキャストはJava 7では不可能ですが、Java 8では、キャストを含む変数の使用にアノテーションを適用する機能が追加されます。これは、Java 8に実装することが可能となるので
(@NonNull Integer) y
は構文的に可能ですが、コンパイラーは注釈に基づいて特定のバイトコードを発行することはできません。ランタイムアサーションの場合、bugs.eclipse.org / 442103で説明されているように、小さなヘルパーメソッドで十分です(例:)directPathToA(assertNonNull(y))
。安全な唯一の方法は、実際のnullチェックを実行することです(うまくいけば、elseブランチの代替実装)。
@Nonnull
と@Nullable
複数の類似annoationsがあるので(参照してください、あなたが話しているこの質問を)。パッケージ内の注釈について話していますjavax.annotation
か?
@Nullable
または@Nonnull
彼らは価値がある場合、それは「要請議論に可能性が」非常にある