2016-11-21 33 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字段永遠不爲null(mongo創建Player的實例並立即設置id字段)。我不想在任何地方進行非空檢查。

我試圖讓一個非空吸,但它不會編譯:

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

我還可以做一些短線的ID,並在構造函數中使用它,但是這看起來像一個骯髒的黑客:

val DUMMY_ID = new ObjectId("000000000000000000000000"); 

那麼是否有解決此問題的解決方法?

+2

放'lateinit'您的變量之前,這基本上意味着,不要打擾如何,但我確保它會被初始化 – succcubbus

+0

[這個類似的pro在休眠和解決方案瑕疵](https://stackoverflow.com/questions/32038177/kotlin-with-jpa-default-constructor-hell)的幫助? – miensol

回答

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這樣的:

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

'lateinit'是在這種情況下做的正確的事情;無需打擾第二個屬性。 – yole

+0

謝謝,'lateinit'就是我需要的東西 – awfun

+0

@yole每個人都是他自己的,因爲某種原因我個人不喜歡'lateinit'。 –