4

私はAPIを書いているので、私のAPIは外部モジュールから使用されます。そして、これは、何をアサーションまたはjava.lang.IllegalArgumentException

/**
 * Adds translation of information to underlying store for particular language
 * @param languageId The identifier of the language 
 * @param translation The translation provided for the specific language
 * @throws AssertionError if the provided language id is {@code null} or empty
 *         or provided translation is {@code null} or empty
 */
public final void addTranslation(String languageId, String translation){
    assert !(Strings.isNullOrEmpty(languageId));
    assert !(Strings.isNullOrEmpty(translation));

    translations.put(languageId, translation);
}

ランタイム例外を使用すると、この API を使用しているアプリケーションの実行に悪影響を与える可能性があると思います。アサーションを使用すると、アサーション フラグが無効になっていると、API が損なわれます。

また、同様の投稿When to use an assertion and when to use an exceptionを読んでみました。しかし、どのケースが私のものかを検出するのは少し混乱します。

アサーションをどこで使用し、ランタイム例外をどこで使用するか、厳密に定義された方法はありますか?

4

4 に答える 4

4

アサーションは通常、本番環境でオフにできる開発手法です。これは、Java、Eiffel、C++、およびそれらを使用する私が知っているすべての言語に当てはまります。

個人的には、契約を強制するためにランタイム例外を好みます。それらをオフにすることはできません。

于 2013-03-09T15:15:45.583 に答える
2

API の入力データの検証にアサーションを使用しないでください。たとえば、API が正しく使用されていない場合は、実行時例外をスローするだけです。IllegalArgumentException

于 2013-03-09T15:17:22.373 に答える
0

アサーションはテストのみに使用されます。他の使用法では、例外を使用するか、構造体を使用する必要があります (例外をキャッチするよりもはるかに高速であるため、2 番目のソリューションが推奨されます)。

于 2013-03-09T15:18:05.500 に答える
-2

ビジネスロジックの実装には、アサーションも例外も使用しないでください。単純な理由の1つは、例外の処理が非常に遅いことです。コードが頻繁に呼び出され、不正な入力を処理するのに時間がかかりすぎると想像してみてください。1つのコントラクトを受け入れるだけです。呼び出しの前に変数をチェックし、クリーンなパラメーターのみを渡すか、メソッドの先頭にあるifステートメントで変数をチェックします。

UPD

アサーションは、発生してはならないことをチェックするために使用する必要がありますが、例外は、発生する可能性があることをチェックするために使用する必要があります。

Javaでのアサーションの使用

アサーションは、プログラムをクラッシュさせることが目的であるため、例外ではなくエラーをスローします。

クラスエラー

エラーはThrowableのサブクラスであり、妥当なアプリケーションがキャッチしようとしてはならない重大な問題を示します。そのようなエラーのほとんどは異常な状態です。

AssertionErrorはErrorのサブクラスです

于 2013-03-09T15:48:24.097 に答える