質問: お世話になっております。 assertをコードに書いたことがないのですが、 どのような場合に使用してますか? 例えばメソッドの先頭でobjAはnullでないことを前提に処理が行われる場合に assert objA != null ; を入れたりすると思いますが、 これはnullの場合に例外をスローする、でも置き換えられます。(アサートをONにしている場合のみ) また、先頭ではなく、以下のような使い方ってどうでしょうか? ``` if(isA){ //something } else if (isB){ //something } else { assert false;//通ってはいけない分岐 } ``` 皆さんがどのような場合に例外ではなくアサートを使用しているか気になります。
回答: 契約プログラミングではアサーションを記述すべき個所は3つあります。 * 事前条件 * 事後条件 * 不変条件 !イメージ説明 必ずしもメソッドの先頭に記述すべきものではありません。 Java言語では「契約プログラミング」におけるアサーションの記述の方法は2つあると思います。 * assert文による記述 * throw文による記述 どちらを使ってもよいと思いますが、前者は他の回答にあるとおり-eaオプションを設定しないと有効になりません。一般的にJUnitでのテストなどでは-eaオプションを設定し、本番環境では設定しないことが多いと思います。逆に後者はオプションで有効/無効を切り替えることはできず、標準ライブラリの中でも積極的に使用されています。 アサーションによるオーバーヘッドは小さいもので本番時に無効にするメリットはないと思います。「性能向上のため標準ライブラリで引数のチェックをやめるべき」という議論は聞いたことがありません。だからassert文ではなくthrow文による記述をすべきだと思います。