assert condition : message;
をすばやく変更できるようにしてい
assert condition : message;
に
if (!condition) throw new AssertionError(message);
コード全体。 誰かがチェックの信頼性が十分でないことを恐れており、誰かがそれをオンにするのを忘れると、いくつかのバグが気付かれなくなります。 反対に、誰かがパフォーマンスについてマニカルに考えます:誰かが最初のグループの人によって書かれたサブシステム/ライブラリのチェックをオンにし、「生産的な」ライブラリのパッケージまたはクラスを除外するのを忘れると、無駄な計算によって実行が遅くなります。
私の意見では、チェックには何も問題はありませんが、コード上で可能な限り寛大に配置することができます。 まず、すでに述べたように(ただし、これは新しい可能性があります)、JVMの起動時とプログラム(ClassLoaderを使用 )の両方で、チェックを柔軟に構成できます( パッケージおよび個々のクラスで有効化/無効化 )。したがって、あるシステムでチェックを突然オンにし、別のシステムでオフにしたい場合、これは間違いなく解決すべき問題です。
第二に、時々、
- == false true
ような些細な条件ではなく、クラス内のチェック状態を維持し、メソッドでチェックしたいことがあります。
assert
トリックを使用すると、チェックを無効にして実行すると、ほぼ無料でこれを実現できます。
トリックは簡単です:検証状態の初期化と更新は、意味によって何も返さないメソッド(
void
)、およびコード内で行われます-
boolean
で常に
true
です。 これらのメソッドは、「スルー」
assert
と呼ばれます。 つまり、クラスのチェックが無効になっている場合、メソッドは呼び出されず、テスト状態は初期化または更新されず、オーバーヘッド内のオブジェクトメモリには
null
参照が1つだけ残ります。
例:
import java.util.HashSet; import java.util.Set; public final class MyCoolSet<E> { private Object[] coolStorage; private transient Set<E> referenceSet; public MyCoolSet() { // ... init cool storage assert initReferenceSet(); } private boolean initReferenceSet() { referenceSet = new HashSet<>(); return true; } public int size() { // return the cool size return 42; } public boolean add(E e) { // .. add an element to the cool storage boolean added = true; assert addToReferenceSet(e); return added; } private boolean addToReferenceSet(E e) { referenceSet.add(e); checkSize(); return true; } private void checkSize() { assert referenceSet.size() == size() : "Cool size diverged from reference size"; } public boolean remove(Object o) { // ... remove an element from the cool storage boolean removed = true; assert removeFromReferenceSet(o); return removed; } private boolean removeFromReferenceSet(Object o) { referenceSet.remove(o); checkSize(); return true; } }