Javax validation with Kotlin

必須項目のバリデーション

Kotlinでは@NotNullをNonNullableな型に対して使えない。
バリデーションは一度変数に代入し終わってから動くため、NonNullabe型にnullを代入するとバリデーションが働く前にNullPoが発生してしまうからである。
回避策は、コンストラクタ引数はNullableにした上で、バリデーション後にNonNullableなメンバへ代入する。

import javax.validation.constraints.NotNull

class Hoge(
    // 必須のメンバ引数
    id: Int?,
    // 任意のメンバ
    val name: String?
) {
    // バリデーション用のメンバ。初期値としてコンストラクタ引数のidを代入する。
    // そして、値取得時にNotNullでバリデーションする。
    private val _id_: Int? = id
        @NotNull get() = field

    // 外から見えるのはこのメンバ
    val id: Int by lazy { _id!! }
}