2016-11-21 4 views
4

Je suis nouveau avec Kotlin et j'essaie de retravailler un petit projet Java dans ce nouveau langage. J'utiliser MongoDB dans mon projet et j'ai une classe, par exemple:Kotlin - getter nonnull pour un champ nullable

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 
} 

je dois marquer id terrain annulable (var id: ObjectId?) en raison du constructeur vide. Lorsque j'essaie d'accéder à ce champ d'une autre classe, je dois utiliser une vérification non nulle: thePlayer.id!!. Mais la logique de mon application est que le champ id n'est jamais nul (mongo crée une instance de Player et définit immédiatement le champ id). Et je ne veux pas faire un chèque non nul partout.

J'ai essayé de faire un getter non nul, mais il ne compile pas:

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

Je peux aussi faire quelques stub pour id et de l'utiliser dans le constructeur, mais cela ressemble à une bidouille:

val DUMMY_ID = new ObjectId("000000000000000000000000"); 

Y a-t-il une solution de contournement pour résoudre le problème?

+2

mis 'lateinit' avant votre variable , cela signifie essentiellement, ne pas déranger, mais je m'assure qu'il sera initialisé – succcubbus

+0

Est-ce que [ce pro similaire blem en hibernation et solution] (https://stackoverflow.com/questions/32038177/kotlin-with-jpa-default-constructor-hell) aide? – miensol

Répondre

3

J'utilise personnellement un private var préfixé par _ + public val dans des situations similaires.

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

Pour votre situation, il ressemblerait à ceci:

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

Vous pouvez également déclarer votre variable lateinit comme ceci:

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

'lateinit' est la bonne chose à faire dans ce cas; pas besoin de s'embêter avec une seconde propriété. – yole

+0

Merci, 'lateinit' est ce que j'ai besoin – awfun

+0

@yole Tout le monde le sien, j'ai une aversion personnelle contre' lateinit' pour une raison quelconque. –