Kotlin – 可空字段的非空吸气

我是Kotlin的新手,我尝试将一个小型的Java项目改为这种新的语言。 我在我的项目中使用mongodb,我有一个类,例如:

class PlayerEntity { constructor() {} //for mongodb to create an instance constructor(id: ObjectId, name: String) { //used in code this.id = id this.name = name } @org.mongodb.morphia.annotations.Id var id: ObjectId? = null var name: String? = null } 

我必须将id字段标记为空( var id: ObjectId? ),因为空的构造函数。 当我尝试从另一个类访问这个字段时,我必须使用非null检查: thePlayer.id!! 。 但是我的应用程序的逻辑是id字段永远不为null(mongo创建Player实例并立即设置id字段)。 而且我不想在任何地方进行非空的检查。

我试图做一个非null的getter,但它不能编译:

 var id: ObjectId? = null get(): ObjectId = id!! 

我也可以为id做一些存根,并在构造函数中使用它,但是这看起来像一个肮脏的黑客:

 val DUMMY_ID = new ObjectId("000000000000000000000000"); 

那么是否有解决方法来解决这个问题?

我个人在类似的情况下使用_ + public val作为前缀的私有变量。

 class Example<out T> { private var _id: T? = null val id: T get() = _id!! } 

对于你的情况,它看起来像这样:

 @org.mongodb.morphia.annotations.Id private var _id: ObjectId? = null val id: ObjectId get() = _id!! 

或者,像这样声明你的变量为lateinit

 @org.mongodb.morphia.annotations.Id lateinit var id: ObjectId