2016-11-21 10 views
4

私はKotlinとの新たなんだと私は、この新しい言語に小さなJavaプロジェクトを手直ししてみてください。例えば、私は私のプロジェクトではMongoDBを使用して、私はクラスを持っている:Kotlin - NULL可能フィールドのNULL以外のゲッター

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 
} 

は私が原因空のコンストラクタの(var id: ObjectId?)としてNULL値可能idフィールドをマークする必要があります。別のクラスからこのフィールドにアクセスしようとすると、null以外のチェックを使用する必要があります:thePlayer.id!!。しかし、私のアプリケーションのロジックは、idフィールドがnullでないことです(mongoはPlayerのインスタンスを作成し、すぐにidフィールドを設定します)。そして私はどこでも非nullチェックをしたくありません。

は、私がnull以外のゲッターを作ってみましたが、それはコンパイルされません:

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

私もIDのいくつかのスタブを作成し、コンストラクタでそれを使用することができますが、これは汚いハックのようになります。

val DUMMY_ID = new ObjectId("000000000000000000000000"); 

問題を解決するための回避策がありますか?

+2

プット ':

@org.mongodb.morphia.annotations.Id private var _id: ObjectId? = null val id: ObjectId get() = _id!! 

また、このようなlateinitとして、あなたの変数を宣言しますそれは基本的には、方法を気にしないで、私はそれが初期化されることを確認します。 – succcubbus

+0

[これと同様のプロblem休止状態と溶液中](https://stackoverflow.com/questions/32038177/kotlin-with-jpa-default-constructor-hell)を助けますか? – miensol

答えて

3

私は個人的に_ +似の状況では、公共のvalで始まるプライベートVARを使用しています。あなたの状況については

class Example<out T> { 
    private var _id: T? = null 
    val id: T 
    get() = _id!! 
} 

、それは次のようになりますあなたの変数の前にlateinit`

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

'lateinit'はこの場合正しいことです。 2番目のプロパティを気にする必要はありません。私はみんな@yole彼自身を – yole

+0

おかげで、 '、私はいくつかの理由で' lateinit'に対する個人的な嫌悪感を持っています。 – awfun

+0

を必要とするものであるlateinit' –

関連する問題