2016-11-21 6 views
4

Я новичок в Kotlin, и я пытаюсь переделать небольшой проект Java на этот новый язык. Я использую MongoDB в моем проекте, и у меня есть класс, например:Kotlin - nonnull getter для поля с нулевым значением

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!! 

Я также могу сделать некоторые заглушки для ид и использовать его в конструкторе, но это выглядит как грязный хак:

val DUMMY_ID = new ObjectId("000000000000000000000000"); 

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

+2

положить 'lateinit' перед переменной , это в основном означает, не беспокойтесь, но я гарантирую, что он будет инициализирован – succcubbus

+0

Имеет ли [этот схожий про в hibernate и решении] (https://stackoverflow.com/questions/32038177/kotlin-with-jpa-default-constructor-hell) help? – miensol

ответ

3

Я лично использую частный var с префиксом _ + 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 
+3

'lateinit' - правильная вещь в этом случае; не нужно беспокоиться о втором имуществе. – yole

+0

Спасибо, 'lateinit' - это то, что мне нужно – awfun

+0

@yole Все, кто-то свой, у меня есть личная неприязнь к' lateinit' по какой-то причине. –

 Смежные вопросы

  • Нет связанных вопросов^_^