Скажем, у меня есть такой класс:
data class URLAndPath(
val baseUrl: URL,
val path: String?
) {
val url get(): URL? =
try { path?.let { URL(baseUrl, it) } }
catch(_: Exception) { null }
init { require(path == null || url != null) { "Invalid URL $baseUrl$path" } }
}
Этот класс гарантирует, что если path != null
тогда и только тогда, когда url != null
Котлин заключает контракт кажетсяспособ рассказать компилятору об этих видах отношений.Возможен ли вышеупомянутый инвариант для моделирования с контрактами Котлина?
Мой конечный результат - позволить коду наподобие следующего компиляции:
val x = URLAndPath(URL("http://example.org/"), "index.html")
if(x.path != null) {
// currently: Error: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type URL?
println(x.url.toURI())
}