Kotlin - 可空字段的非空 getter
Kotlin - nonnull getter for a nullable field
我是 Kotlin 的新手,我尝试用这种新语言重新编写一个 Java 小项目。我在我的项目中使用 mongodb 并且我有一个 class,例如:
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?
)。当我尝试从另一个 class 访问此字段时,我必须使用非空检查:thePlayer.id!!
。但是我的应用程序的逻辑是 id
字段永远不会为空(mongo 创建 Player 的实例并立即设置 id 字段)。而且我不想到处做非空检查。
我试图创建一个非空 getter,但它没有编译:
var id: ObjectId? = null
get(): ObjectId = id!!
我也可以为 id 创建一些存根并在构造函数中使用它,但这看起来像是一个肮脏的 hack:
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
(但请注意,这公开了 setter publicly):
@org.mongodb.morphia.annotations.Id
lateinit var id: ObjectId
我是 Kotlin 的新手,我尝试用这种新语言重新编写一个 Java 小项目。我在我的项目中使用 mongodb 并且我有一个 class,例如:
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?
)。当我尝试从另一个 class 访问此字段时,我必须使用非空检查:thePlayer.id!!
。但是我的应用程序的逻辑是 id
字段永远不会为空(mongo 创建 Player 的实例并立即设置 id 字段)。而且我不想到处做非空检查。
我试图创建一个非空 getter,但它没有编译:
var id: ObjectId? = null
get(): ObjectId = id!!
我也可以为 id 创建一些存根并在构造函数中使用它,但这看起来像是一个肮脏的 hack:
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
(但请注意,这公开了 setter publicly):
@org.mongodb.morphia.annotations.Id
lateinit var id: ObjectId