Java >> Java チュートリアル >  >> Tag >> assert

製品コードの assert ステートメントで not null をアサートする必要がありますか?

Objects.requireNonNull(Object) を使用

指定されたオブジェクト参照が null でないことを確認します。このメソッドは、主にメソッドとコンストラクターでパラメーターの検証を行うために設計されています [...]

あなたの場合は次のようになります:

public void useObject(CustomObject customObject) {
    object = customObject.getObject();
    Objects.requireNonNull(object); // throws NPE if object is null
    // do stuff with object
}

この関数は、あなたがやりたいことのために作られています:null であってはならないものを明示的にマークしてください。 .利点は、null が見つかることです。 -値が発生してはならない場所。 null によって引き起こされる問題をデバッグする際のトラブルが少なくなります。

もう 1 つの利点は、assert とは対照的に、この関数を使用する際の柔軟性です。 . assert の間 ブール値をチェックするためのキーワード、Objects.requireNonNull(Object) は関数であり、はるかに簡単にコードに埋め込むことができます。

Foo foo = Objects.requireNonNull(service.fetchFoo());

// you cannot write it in one line.
Bar bar = service.fetchBar();
assert bar != null;
service.foo(Objects.requireNonNull(service.getBar()));

// you cannot write it in one line.
Bar bar = service.getBar();
assert bar != null;
service.foo(bar);

Objects.requireNonNull(Object) に注意してください null のみ - assert 中のチェック 一般的なアサーション用です。だから assert さまざまな目的があります。主にテストです。有効にする必要があるため、テスト用に有効にし、本番環境で無効にすることができます。これを使用して、テストのみのテストをテスト、またはプロダクション コード用のチェックから分離します。


アサーションについて覚えておくべき最も重要なことは、アサーションは無効にできるということです。したがって、アサーションが実行されると想定しないでください。

下位互換性のために、JVM はデフォルトでアサーション検証を無効にします。 -enableassertions コマンド ライン引数、またはその短縮形 -ea:を使用して明示的に有効にする必要があります。

java -ea com.whatever.assertion.Assertion

そのため、それらに依存することはお勧めできません。

アサーションはデフォルトでは有効になっていないため、コードで使用されたときにアサーションが実行されるとは想定できません。したがって、null 値と空の Optional を常にチェックし、アサーションを使用してパブリック メソッドへの入力をチェックすることを避け、代わりにチェックされていない例外を使用する必要があります...一般に、アサーションが存在しないかのようにすべてのチェックを行います。


確かにあなたが言っていることはあからさまな嘘です。理由は次のとおりです。

スタンドアロンの jvm を実行するだけの場合、アサーションはデフォルトで無効になっています。無効にすると、フットプリントがゼロになるため、本番アプリケーションには影響しません。ただし、コードを開発およびテストするときはおそらく親友であり、ほとんどのテスト フレームワーク ランナーはアサーションを有効にします (JUnit はそうします)。そのため、単体テストを実行するとアサーション コードが実行され、潜在的なバグを早期に検出するのに役立ちます (例:一部のビジネス ロジック境界チェック用にアサートを追加できます。これにより、不適切な値を使用する一部のコードを検出するのに役立ちます)。

とはいえ、他の回答が示唆するように、まさにその理由で (常に有効になっているわけではありません)、アサーションに依存していくつかの重要なチェックを行ったり (特に!) 状態を維持したりすることはできません。

アサートの使用方法の興味深い例については、こちらをご覧ください。ファイルの最後にメソッド singleThreadedAccess() があります。 これは 201 行目の assert ステートメントから呼び出され、テストで潜在的なマルチスレッド アクセスをキャッチするために存在します。


Java タグ