10

我是 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?)。当我尝试从另一个类访问此字段时,我必须使用非空检查:thePlayer.id!!。但是我的应用程序的逻辑是该id字段永远不会为空(mongo 创建一个 Player 实例并立即设置 id 字段)。而且我不想到处进行非空检查。

我试图制作一个非空吸气剂,但它没有编译:

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

我还可以为 id 制作一些存根并在构造函数中使用它,但这看起来像一个肮脏的 hack:

val DUMMY_ID = new ObjectId("000000000000000000000000");

那么有没有办法解决这个问题呢?

4

1 回答 1

4

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

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
于 2016-11-21T09:43:50.710 回答