首页 文章

Kotlin - 可空场的非空吸气剂

提问于
浏览
4

我是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 字段永远不为null(mongo创建一个Player实例并立即设置id字段) . 而且我不想在任何地方进行非空检查 .

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

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

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

val DUMMY_ID = new ObjectId("000000000000000000000000");

那么有解决问题的解决方法吗?

1 回答

  • 3

    我个人在类似的情况下使用前缀为 _ 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):

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

相关问题