#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
}