hamburger

主に日記

Kotlinのコンストラクタで引数チェックする

引数のうちのどれかが設定されていることを保証したいケースがあり、init内でのバリデーションを使用してみた。

例えば下のケースだと、氏名あるいはを設定してfullNameを取得できるようにしたい、みたいな状況。

class User(
    private val _firstName: String? = null,
    private val _lastName: String? = null,
    private val _fullName: String? = null,
) {
    init {
        require((_fullName != null) or ((_firstName != null) and (_lastName != null)))
    }

    val fullName: String get() = (_fullName ?: (_firstName?.plus(_lastName)))!!
}

すべての引数がOptionalなのでUser()という宣言もできるが、すべてnullだとエラーになるのですぐ気づける。 もしrequireがなかった場合、fullNameが空文字になったりoptionalで宣言したりする必要があり、問題特定に時間がかかるかもしれない。

初期化時点で検知できるものはrequireあるいはcheckを使用して早めに検知していきたい。