Kotlin - ненулевой геттер для поля, допускающего значение NULL

Я новичок в 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 и использовать ее в конструкторе, но это выглядит как грязный хак:

val DUMMY_ID = new ObjectId("000000000000000000000000");

Так есть ли обходной путь для решения проблемы?


person awfun    schedule 21.11.2016    source источник
comment
поместите lateinit перед вашей переменной, это в основном означает, не беспокойтесь как, но я гарантирую, что она будет инициализирована   -  person succcubbus    schedule 21.11.2016
comment
Помогает ли эта аналогичная проблема в спящем режиме и решении?   -  person miensol    schedule 21.11.2016


Ответы (1)


Я лично использую приватную переменную с префиксом _ + 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
person F. George    schedule 21.11.2016
comment
lateinit в этом случае правильно; не нужно возиться со вторым свойством. - person yole; 21.11.2016
comment
Спасибо, lateinit это то, что мне нужно - person awfun; 21.11.2016
comment
@yole У каждого свое, у меня личная неприязнь к lateinit по какой-то причине. - person F. George; 21.11.2016
comment
Я лично использую приватную переменную с префиксом _ + public val в подобной ситуации. В чем разница между этим и общедоступным var с частным сеттером? Есть ли один? - person Rocoty; 22.11.2016
comment
Геттер/сеттер не может переопределить родительский тип var/val, поэтому любому, кто использует геттер, все равно придется ненулевое утверждение (!!) возвращаемого значения. - person F. George; 23.11.2016