position de bloque init en class en Kotlin

Recientemente me encontré con una situación en la que los valores de mi variable estándar son reemplazados por el pnetworkingeterminado, incluso si he asignado un valor con el constructor usando el bloque init.

Lo que probé fue:

class Example(function: Example.() -> Unit) { init { function() } var name = "default name" } // assigning it like this: val example = Example { name = "new name" } // print value print(example.name) // prints "default name" 

Después de luchar un poco, he encontrado que la position del bloque init importa. Si pongo el bloque init como último en la class, primero inicializa el nombre con el pnetworkingeterminado y luego llama a la function () que reemplaza el valor con el "nuevo nombre".

Y si lo pongo primero, no encuentra el nombre y se reemplaza por el "nombre pnetworkingeterminado" cuando las properties se inicializan.

Esto es extraño para mi ¿Alguien puede explicar por qué ha sucedido esto?

La razón es que kotlin sigue un enfoque de arriba hacia abajo

De los documentos ( Una mirada en profundidad a los inicializadores de Kotlin ) Los inicializadores (inicializadores de propiedad y bloques init) se ejecutan en el order en que se definen en la class, de arriba hacia abajo .

Puede definir múltiples constructores secundarios, pero solo se llamará a uno cuando cree una instancia de class a less que el constructor llame explícitamente a otra.

Los constructores también pueden tener valores de argumento pnetworkingeterminados que se evalúan cada vez que se llama al constructor. Al igual que los inicializadores de properties, pueden ser llamadas a funciones u otras expresiones que ejecutarán código arbitrario.

los inicializadores se ejecutan de arriba a abajo al comienzo del constructor primario de una class.

Esta es la forma correcta

 class Example(function: Example.() -> Unit) { var name = "default name" init { function() } } 
  • ¿Regex o comodín en la statement de Kotlin cuando?
  • Forma correcta de inyectar Dagger 2 + Kotlin + ViewModel
  • Error: no se encontró el procesador de annotations '__gen.AnnotationProcessorWrapper_debug_android_databinding_annotationprocessor_ProcessDataBinding'
  • ¿Cómo se ocultan los parameters en los pasos de creación personalizados en Kotlin para TeamCity?
  • Vista de Android get el contenido original "Ajustar contenido" de mi vista
  • Jenkins gradle build falla debido a la aplicación: compileDebugKotlin
  • Clase plotble de Kotlin lanzando ClassNotFoundException
  • Kotlin, tabla / matriz basada en inputs con campos dynamics
  • inyección de guice: diferencia entre getBinding / getExistingBinding / getProvider y getInstance
  • Android: ¿cómo lograr setOnClickListener en Kotlin?
  • Dagger2 y Kotlin ejecutan la causa fallida por: aplicación: compileDebugKotlinAfterJava