Can a field be migrated to a non-zero version?

I have a data class

data class MyModel(private val _data: MyData? = null)

      

And I want my data to be available only if it is not null, otherwise thrown. I use below which is good.

    fun getData(): MyData {
        return checkNotNull(_data) { "data shouldn't be null" }
    }

      

However, if I follow the guide to override getter for Kotlin data class , below complaint I need to return MyData?

insteadMyData

val data = _data
    get(): MyData {
        return checkNotNull(field) { "data shouldn't be null" }
    }

      

Is it true that field

it cannot be cast to a non-null version of it on return?

+3


source to share


3 answers


If your goal is to declare a getter for a property Any?

that returns Any

, this is not possible. You will receive the following error:

Getter return type must be equal to property type

So trying to do something like

val test : String?
    get() : String = "hi"

      

Does not work.


However, you can hide the nullable property and expose a non-nullable property that refers to the nullable value using casting:



private val test : String? = "hi"
val testNotNull : String = test as String

      

If it test

references null

, an exception will be thrown.

For example:

fun main(args: Array<String>) = print(Demo().testNotNull)

class Demo(private var test: String? = "hi") {
    val testNotNull : String
.       get() = test as String
}

      

You can check this snippet at try.kotlin.org

It's not safe, though. You must rethink your design. If you don't interact with Java, you shouldn't punish yourself with null types.

+2


source


I don't think you can. What you did with fun getData()

is a valid approach IMO. Or you can just not use the data class and create a normal class, obviously.

I think it might work with something like this:

typealias notNullType = MyData

data class Test(private val _value: MyData? = null) {
    val v: notNullType = _value as notNullType
    get() { return field }
}

      



This will allow you to completely:

fun play() {
    val t = Test(null)
    print(t.v) //see what I did? :-)
}

      

WHAT SAID ... I don't think "hiding" an option is ?

necessary - it's a good idea.

+1


source


This does not necessarily mean that the MyData class is NULL if you chose it as MyData?

" ? " Just allows the object to be null in an instance that actually becomes null to avoid a runtime exception.

You can make your class nullable and it can still contain your data.

0


source







All Articles