h2database に見る Assertion スイッチによる初期化



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 が無効な場合、前述のソースは以下のようになり、ASSERTfalse となります。

private static final boolean ASSERT;

static {
    boolean a = false;
    // Intentional side-effect
    // assert a = true;
    ASSERT = a;
}

そして、assertion が有効な場合は(代入演算は代入された値を返すので)、ASSERTtrue となります。


すると、複雑な不変条件がある場合に以下のように書けるようになります。

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;
    }


ちょっと面白い使い方ですね。