h2database のソース見てたら以下のようなコードがあった
private static final boolean ASSERT; static { boolean a = false; // Intentional side-effect assert a = true; ASSERT = a; }
Assertion (表明)
assertion は Programming By Contract または Design By Contract をサポートするために、古く J2SE 1.4 で追加された機能です。
構文は assert
キーワードを使い、以下のようになります。
assert expression1; assert expression1 : expression2;
expression1 には、論理値を返す任意の式を記載します。この式が false
となる場合は例外 AssertionError
となり、事前条件や事後条件、クラスの不変条件を表現します。
expression2 には AssertionError
のコンストラクタの引数として渡されるメッセージ文字列を指定します。
非 null な変数 x
を表明するには以下のようになります。
assert x != null;
assertion を有効にするにはコマンドライン引数で -ea
や -enableassertions
のように指定する必要があります。
java -ea SomeClass
assertion を有効にするスイッチが無かった場合、assert
文は評価されず、単なる空行として扱われます。
まぁ、今では assert
を使ったソースはほとんど見ることは無い訳ですが。
Assertion スイッチによる初期化
assertion が無効な場合、前述のソースは以下のようになり、ASSERT
は false
となります。
private static final boolean ASSERT; static { boolean a = false; // Intentional side-effect // assert a = true; ASSERT = a; }
そして、assertion が有効な場合は(代入演算は代入された値を返すので)、ASSERT
は true
となります。
すると、複雑な不変条件がある場合に以下のように書けるようになります。
public long getFilePointer() { if (ASSERT) { try { if (file.position() != filePos) { throw DbException.getInternalError(file.position() + " " + filePos); } } catch (IOException e) { throw DbException.convertIOException(e, name); } } return filePos; }
ちょっと面白い使い方ですね。