Javaアサーションの使用

Javaアサーションの使用

1. 前書き

Javaassertキーワードを使用すると、開発者はプログラムの特定の仮定または状態をすばやく確認できます。

この記事では、we’ll take a look at how to use the Java assert keyword.

2. Javaアサーションの歴史

JavaassertキーワードはJava 1.4で導入されたため、かなり前から存在しています。 ただし、ボイラープレートを大幅に削減し、コードを読みやすくすることができるあまり知られていないキーワードのままです。

たとえば、多くの場合、コード内で、アプリケーションが正常に動作しなくなる可能性がある特定の条件を検証する必要があります。 通常、次のように記述します。

Connection conn = getConnection();
if(conn == null) {
    throw new RuntimeException("Connection is null");
}

アサーションを使用すると、1つのassertステートメントでifおよびthrowステートメントを削除できます。

3. Javaアサーションの有効化

Javaアサーションはassertキーワードを使用するため、インポートするライブラリやパッケージは必要ありません。

Java 1.4より前は、変数、メソッドなどの命名に「アサート」という単語を使用することは完全に合法でした。 これにより、古いコードを新しいJVMバージョンで使用すると、名前の衝突が発生する可能性があります。

したがって、下位互換性のために、the JVM disables assertion validation by default。 これらは、-enableassertionsコマンドライン引数またはその省略形-ea:のいずれかを使用して明示的に有効にする必要があります。

java -ea com.example.assertion.Assertion

この例では、すべてのクラスに対してアサーションを有効にしました。

特定のパッケージおよびクラスのアサーションを有効にすることもできます。

java -ea:com.example.assertion... com.example.assertion.Assertion

ここでは、com.example.assertionパッケージ内のすべてのクラスに対してアサーションを有効にしました。

同様に、-disableassertionsコマンドライン引数またはその省略形-daを使用して、特定のパッケージおよびクラスに対して無効にすることができます。 これら4つの引数すべてを一緒に使用することもできます。

4. Javaアサーションの使用

アサーションを追加するには、simply use the assert keyword and give it a boolean condition

public void setup() {
    Connection conn = getConnection();
    assert conn != null;
}

Javaは、文字列を受け取るアサーションの2番目の構文も提供します。これは、AssertionErrorがスローされた場合に構築するために使用されます。

public void setup() {
    Connection conn = getConnection();
    assert conn != null : "Connection is null";
}

どちらの場合も、コードは外部リソースへの接続がnull以外の値を返すことを確認しています。 その値がnull,の場合、JVMはautomatically throw an AssertionErrorになります。

2番目の場合、例外にはスタックトレースに表示される追加の詳細が含まれ、問題のデバッグに役立ちます。

アサーションを有効にしてクラスを実行した結果を見てみましょう。

Exception in thread "main" java.lang.AssertionError: Connection is null
        at com.example.assertion.Assertion.setup(Assertion.java:15)
        at com.example.assertion.Assertion.main(Assertion.java:10)

5. AssertionErrorの処理

クラスAssertionErrorErrorを拡張し、それ自体がThrowableを拡張します。 これは、AssertionErrorがチェックされていない例外であることを意味します。

したがって、アサーションを使用するメソッドはそれらを宣言する必要がなく、それ以上の呼び出しコードはそれらを試行してキャッチするべきではありません。

アプリケーションではAssertionErrors are meant to indicate unrecoverable conditionsであるため、それらを処理したり、回復を試みたりしないでください。

6. ベストプラクティス

アサーションについて覚えておくべき最も重要なことは、アサーションを無効にできることです。したがって、never assume they’ll be executedです。

したがって、アサーションを使用するときは、次のことに注意してください。

  • 必要に応じて、常にnull値と空のOptionalsを確認してください

  • パブリックメソッドへの入力をチェックするためにアサーションを使用することは避け、代わりにIllegalArgumentExceptionNullPointerExceptionなどのチェックされた例外を使用してください

  • アサーション条件でメソッドを呼び出さず、代わりにメソッドの結果をローカル変数に割り当て、その変数をassertで使用します

  • アサーションは、switchステートメントのdefaultの場合や、終了しないループの後など、コード内の決して実行されない場所に最適です。

7. 結論

Javaassertキーワードは長年使用されてきましたが、この言語のあまり知られていない機能のままです。 多くの定型コードを削除し、コードを読みやすくし、プログラム開発の初期段階でバグを特定するのに役立ちます。

アサーションはデフォルトでは有効になっていないため、コードで使用されたときに実行されると思い込まないでください。

いつものように、完全なソースコードはover on GitHubで利用できます。