2016-11-21 3 views
4

저는 Kotlin에 익숙하며이 새로운 언어로 작은 Java 프로젝트를 다시 작성하려고합니다. 예를 들어, 나는 내 프로젝트에서 MongoDB를 사용하고 난 클래스가 :Kotlin - nullable 필드에 null이 아닌 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 
} 

내가 때문에 빈 생성자 (var id: ObjectId?)로 널 (NULL) id 필드를 표시해야합니다. 다른 클래스에서이 필드에 액세스하려고 할 때 null이 아닌 체크를 사용해야합니다 : thePlayer.id!!. 하지만 내 응용 프로그램의 논리는 id 필드가 null이 아니란 것입니다 (mongo는 Player의 인스턴스를 만들고 ID 필드를 즉시 설정합니다). 그리고 나는 모든 곳에서 non-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

[이 유사 프로 최대 절전 모드 및 솔루션의 흠집] (https://stackoverflow.com/questions/32038177/kotlin-with-jpa-default-constructor-hell) help? – miensol

답변

3

개인적으로는 비슷한 상황에서 _ + public 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'이이 경우에 올바른 작업입니다. 두 번째 속성을 신경 쓰지 않아도됩니다. – yole

+0

감사합니다. 'lateinit'은 내가 필요로하는 것입니다. – awfun

+0

@yole 누구나 자기 자신, 나는 어떤 이유로 lateinit에 대한 개인적 싫어함을 가지고 있습니다. –

관련 문제