web-dev-qa-db-ja.com

キーワードをJava

assertキーワードを使用していますか、または検証ランタイム例外をスローしますか?それはあなたにどのような利益をもたらしますか、なぜそれを使用する価値がないと思いますか?

40
Stan Kurilin

Assertは、条件がfalseの場合、ランタイムエラー( AssertionError )をスローします。アサートは、コードの正確性基準を文書化、チェック、および強制する合理化された方法を提供します。利点は、これらの正確性条件を定義および操作するための言語レベルのフックです。それらを有効または無効にしたい範囲で(これが良いアイデアであるかどうかについての議論があります)、JVMコマンドラインから行うことができます。以下の一部のコメント作成者は、デバッグモードで実行しない限り、アサーションはデフォルトで無効になっていることに注意しています。私の習慣は、常にラッパースクリプトに「-ea」(アサーションを有効にする)を追加することです。パフォーマンスに敏感なコードでさえ、私にとっては、アサーションから得られるセキュリティ/正確さの信頼性を優先するトレードオフが重要です。 Oracleでのアサーション および AssertionErrorのAPIの説明

予想外または予期しない障害(例外)(コントロール外の可能性がある)とアサーション障害の違いに注意してください。アサーション障害はプログラマーの前提を文書化し、予期しない外部条件または予想される例外条件ではなく、誤ったプログラムを示します。 アサーション障害が発生した場合、他のエラーまたは障害の原因ではなく、プログラマーがプログラムを誤解または誤って表現したと解釈されます。

実際には、私はそれを使用して、私が作る明白または非自明な仮定と、(特にプライベート/内部)コードを生成するときに強制したい不変式を文書化し、これらの仮定がどこで行われるのかを自分や他の人に明確にします作成され、それらが検証されるかどうか。同じ効果に対するコメントよりもはるかに優れています。これは、 契約による設計 への(小さな)ステップです。

Effective Java item#38 "有効性のパラメータを確認"( Google BooksAmazon.com )は、パラメータチェックとアサーションの適切な使用。

SOに関連する:( netbeansのアサーションを有効にする )、( アサーションと例外 )、( 重複を近く、例を求めて )、(- 不適切な名前だが非常に類似したコンテンツ

64
andersoj

andersojは正しいです。知っておくとよいのは、アサートの素晴らしいところは、単純にオフにできることです(Javaコマンドライン)で-eaを渡さない場合。開発、あなたがあなた自身のコードを壊していないことを確認したいとき。

4

それはあなたにどんな利点を与えますか、それを使う価値がないと思う理由は何ですか?

他の人が推奨しているように、強制チェックにアサートを使用することは危険な慣行です。

別の開発者がライブラリを使用するとどうなりますか?または、システム管理者またはパワーユーザーは、実行時に-eaフラグを使用してアサートを有効にすることを忘れているか、さらに悪いことには知りませんか?あなたはこれらすべてのチェックを失います、それはそうです。

アサートは開発ツールです。フラグのデフォルトの状態がoffであるという事実は完全に無料です。

アプリケーションの機能や利点はアサートのオンに依存することはありません。

背景として、アサーションは、機能が取得されたC/C++で同じ方法で使用されます。 C/C++では、開発者は通常#define DEBUG ...コンパイル時にアサートを有効または無効にします。通常、C/C++本番コードでは、この機能はオフになっています。

概念的には、Javaでも同じことが当てはまります。実稼働環境では、条件と例外を使用します。それらは本質的に同じものです。

3
kervin

あなたの質問を正確にするために:

アサートは、ステートメントの条件を検証するために使用されます。

assert (some condition)
Example : assert (6 < 7) // condition pass
          assert (6 > 7) // throws AssertionException here

ほとんどの人は、次のStringのユースケースでassertを使用します(ただし、私は個人的にassertを使用するのが嫌いです)。

assert (obj != null || obj.isEmpty() || ... )

私はむしろきれいで目的を果たすグーグルグアバを使用するのが好きです:

Obj.isNullOrEmpty()

詳細: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Strings.html