Можно ли привести поле к ненулевой версии самого себя?
У меня есть класс данных
data class MyModel(private val _data: MyData? = null)
И я хочу убедиться, что мои данные доступны только тогда, когда они не равны нулю, иначе выведите. Я использую ниже, что хорошо.
fun getData(): MyData {
return checkNotNull(_data) { "data shouldn't be null" }
}
Однако, если я буду следовать руководству согласно методу переопределения для класса данных Kotlin, жалобы, приведенные ниже, мне нужно будет вернуть MyData?
вместо MyData
val data = _data
get(): MyData {
return checkNotNull(field) { "data shouldn't be null" }
}
Это правда, что field
не может быть приведен к ненулевой версии этого при возврате?
3 ответа
Если ваша цель - объявить получателя для Any?
свойство, которое возвращает Any
, это невозможно. Вы получите следующую ошибку:
Возвращаемый тип геттера должен быть равен типу свойства
Так что пытаясь сделать что-то вроде
val test : String?
get() : String = "hi"
Не будет работать
Однако вы можете скрыть свойство nullable и предоставить необнуляемое свойство, которое ссылается на значение nullable посредством приведения:
private val test : String? = "hi"
val testNotNull : String = test as String
Если test
ссылка null
, будет сгенерировано исключение.
Например:
fun main(args: Array<String>) = print(Demo().testNotNull)
class Demo(private var test: String? = "hi") {
val testNotNull : String
. get() = test as String
}
Вы можете проверить этот фрагмент на https://try.kotlinlang.org/
Хотя это не безопасно. Вы должны переосмыслить свой дизайн. Если вы не взаимодействуете с Java, вы не должны наказывать себя обнуляемыми типами.
Я не думаю, что ты можешь. Что вы сделали с fun getData()
это верный подход ИМО. Или вы можете просто не использовать класс данных и создать нормальный класс, очевидно.
Я думаю, что это может работать с чем-то вроде этого:
typealias notNullType = MyData
data class Test(private val _value: MyData? = null) {
val v: notNullType = _value as notNullType
get() { return field }
}
Это полностью позволит вам сделать:
fun play() {
val t = Test(null)
print(t.v) //see what I did? :-)
}
ЭТО СКАЗАЛ… Я не думаю, что "прячу" ?
необязательно обязательно хорошая идея.
Это не обязательно означает, что класс MyData будет нулевым, если вы приведете его как MyData?
'?"Просто позволяет объекту быть нулевым в том случае, если он фактически становится нулевым, чтобы избежать исключения во время выполнения.
Вы можете сделать свой класс обнуляемым, и он все еще может содержать ваши данные.