内部ロジックチェックを行うには、Java には 2 つの方法があります。
- assert キーワードを使用します。たとえば、assert(x>y) ;
- 手動でアサーション エラーをスローします。たとえば、if(y>x) throw new AssertionError();
上記の 2 つの方法の違いは何ですか (パフォーマンスの観点から、プログラミングの柔軟性など)。どちらが優れたプログラミング手法と見なされますか?
内部ロジックチェックを行うには、Java には 2 つの方法があります。
上記の 2 つの方法の違いは何ですか (パフォーマンスの観点から、プログラミングの柔軟性など)。どちらが優れたプログラミング手法と見なされますか?
主な違いは、assert
アサーションが明示的に有効化されていない限り (-ea オプションを介してjava
、またはプログラムによって) が処理されることが保証されないことです。一方、 a を投げるnew AssertionError()
と常に機能します。
参考情報:アサーションを使用したプログラミング
方法 #1 「assert(x>y);」デフォルトではオフになっている JVM 機能を使用します。ただし、1 つのパラメーターで好きなようにオンとオフを切り替えることができるため、柔軟性が高くなります。
方法 2「if(y>x) throw new AssertionError();」assert-param でオフにすることはできません。それはただの例外です。
「実際の」エラー (ネットワークが利用できない、間違った入力が提供された) に対して例外を使用する人をよく見てきましたが、開発/統合中に非常に基本的なチェック ( param not など) のためにアサーションが使用される (つまり、オンになる) ことがよくありnull
ます。IMO、線を引くのは難しいです。
上記の回答のいずれも、私の 2 番目の質問に答えていません (どのプログラミング方法が優れていると考えられていますか?)。だから私はこれについて私の友人の一人と話しました. 何かが公開されていて、他のサードパーティの開発者がその関数を直接呼び出す可能性があると予想される場合は、明示的な if チェックを実行して例外をスローします。
assert(x>y) が失敗すると、AssertionError が発生します (アサーションが有効になっている場合)。Java アサーションを使用する利点は、コンパイル時に有効または無効にできることです。実稼働環境のアサーションを無効にすると、常にアサーションを実行してパフォーマンスを低下させる AssertionError を手動で発生させる場合と比較して、パフォーマンスが向上します。