Плагин без аргументов, из-за которого ленивый делегат не инициализируется и выдает исключение NullPointerException

#kotlin

#kotlin

Вопрос:

Плагин компилятора Kotlin no-arg используется для создания конструктора, у которого нет аргументов, даже если они требуются классу.

Это очень полезно при работе с сериализацией и десериализацией, например, при чтении значения из DynamoDB от Amazon.

lazy Делегат является часто используемой функцией языка, однако я не могу заставить его работать с плагином no-arg.

 @NoArg
data class Foo(val a: String, val b: String) {
    val delegated by lazy { a   b }
}

val foo = getFooViaReflection() // The deserialization that will use the no-arg constructor
 

При доступе foo.delegated он выдает исключение NullPointerException. После дальнейшей проверки я обнаружил, что поле делегата никогда не инициализируется, и, следовательно, при обращении к нему оно равно null, что приводит к указателю null.

Как обойти это?

Ответ №1:

Такое поведение несколько ожидаемо, и проблема с этим была открыта еще в 2016 году.

Чтобы обойти это, вы должны настроить плагин без аргументов для вызова инициализаторов (будет создан ленивый делегат), для которого по умолчанию установлено значение false.

 // build.gradle
noArg {
    invokeInitializers = true
}

// build.gradle.kts
configure<NoArgExtension> {
    invokeInitializers = true
}