Каков правильный способ использования сравнения "больше чем", "меньше" по сравнению с целыми числами с нулевым значением в Котлине?
var _age: Int? = 0
public var isAdult: Boolean? = false
get() = _age?.compareTo(18) >= 0
Это все еще дает мне ошибку с нулевой безопасностью, компиляция, но как я могу использовать > , <, >= или <= в этом вопросе?
Ответ 1
var age : Int? = 0
public val isAdult : Boolean?
get() = age?.let { it >= 18 }
Другое решение будет использовать делегаты:
var age : Int by Delegates.notNull()
public val isAdult : Boolean
get () = age >= 18
Поэтому, если вы попытаетесь определить возраст или проверить isAdult до того, как возраст будет назначен, вы получите исключение вместо нуля.
В любом случае, я считаю, что возраст = 0 - это какая-то магия, которая однажды может привести к проблемам (даже к проблеме).
Ответ 2
Я использовал нулевой коалесцирующий оператор для преобразования из nullable Int? до непустого значения Int:
var age: Int? = 0
public var isAdult: Boolean? = null
get() = if(age == null) null else (age ?: 0 >= 18)
Ответ 3
Kotlin может использовать для этого функцию расширения в Int, но пока они этого не сделают:
fun Int?.isGreaterThan(other: Int?) =
this != null && other != null && this > other
fun Int?.isLessThan(other: Int?) =
this != null && other != null && this < other
Мои методы возвращают false, а не null, если любой из операндов - null. Это имеет больше смысла для меня.