web-dev-qa-db-ja.com

javax.annotation.Nonnullとassert

メソッドのパラメーターにFindbugsとjavax.annotation.Nonnullを使用しています。

プライベートメソッドでは、通常、次のようなヌル性をチェックするためにアサート行を追加します

private void myMethod(@Nonnull String str) {
    assert str != null
    ....

最新のNetbeansバージョン(7.3rc2)は、アサートチェックが不要であると報告しています(Nonnullアノテーションのため)。これがNetbeansのバグであるかどうかは完全にはわかりません。

@Nonnullアノテーションを指定したため、アサート行を削除できますか?

私が理解している限り、アノテーションは静的分析中にのみ使用されますが、assertが有効になっている場合、実行中にアクティブになるため、この2つは代替ではありません。

14
Gualtiero Testa

アサーションは実行時に評価されます。注釈は、FindBugsが実行前の分析中に問題を検出するのに役立ちます。両方のチェックは実際には競合していないため、両方を保持できます。 IDEがアサートを削除するように指示した場合、それは煩わしいと思います。

13

Netbeansは正しいです。 nullになる可能性があると思われる場合は、注釈を削除してください。できないことがわかっている場合:アサートを削除します。

メソッドがnull値で呼び出される可能性がある場合は、@Nonnull注釈はそこにあるべきではありません。

あなたが言ったように、その注釈は実行時に実際には何もしません:それはIDEと静的コード分析ツールによってのみ使用されます。それは物事がヌルでないことを保証するものではありません。

8
David Lavender

これはプライベートメソッドであるため、注釈付きパラメーターをnullにできないようにすることができます。このアサーションは削除できると思います。

NetBeansがパブリックメソッドに警告する場合、問題があると思います。アサーションを付けることをお勧めします。

それでもプライベートメソッドでのアサーションが必要だと感じる場合は、バイトコードインジェクションを使用できると思います。たとえば、nullチェックを挿入するためのMavenプラグインは次のとおりです。申し訳ありませんが、これは私の個人的なプロジェクトですが、私にはうまくいきます。私はそれがあなたのニーズに合うことができると思います。 https://github.com/KengoTODA/jsr305-maven-plugin

1
Kengo TODA