Llamar al método de una class como arg por defecto en el constructor

Estoy construyendo una class y luego tratando de llamar a un método miembro de esa class como valor pnetworkingeterminado para uno de los arguments arcs del constructor.

¿Por qué no es este Kotlin válido?

// unresolved reference: defaultText class MyThing(val text: String = defaultText()) { fun defaultText() = "hi" } 

Es posible usar dos constructores separados en Java y Kotlin, pero luego pierdo la concisión de los arguments pnetworkingeterminados.

 class MyThing { private val text: String constructor(text: String) { this.text = text } constructor() { this.text = defaultText() } private fun defaultText(): String { return "hi" } } 

El mayor problema de tener una expresión de parámetro pnetworkingeterminada del constructor llamada una function miembro de la misma instancia es que los arguments pnetworkingeterminados se evalúan antes de llamar al constructor.

Dado que tal function miembro debería ejecutarse en una instancia completamente no inicializada de la class (porque incluso los superconstructores funcionarán después de eso, vea esta respuesta sobre el order de ejecución).

Normalmente, las funciones miembro realizan alguna lógica teniendo en count el estado de instancia, y tener una function miembro ejecutada en una instancia vacía puede romper parte de esa lógica (por ejemplo, todos los campos contendrán null s, incluso los campos de respaldo de las properties no nulas de Kotlin) . En general, incluso cuando tales llamadas no fallan en el time de ejecución, es probable que introduzcan errores sutiles, por lo que está prohibido usar una instancia completamente no inicializada.

Con respecto al constructor secundario, bueno, al less se ejecuta después de que el super constructor inicialice una parte de la instancia, que por lo tanto no está completamente vacía, pero depende de usted asegurarse de no utilizar las partes de la class que no se inicializan (si lo hace, puede volver a encontrarse con un error de time de ejecución o introducir un error).

Prefiero sugerir el uso de una function de un companion object (los que se inicializan antes de que la class se use por primera vez) para este propósito:

 class MyThing(val text: String = defaultText()) { companion object { fun defaultText() = "hi" } } 

O incluso una function de nivel superior:

 fun defaultText() = "hi" class MyThing(val text: String = defaultText()) 
  • El método en línea de Kotlin no es visible a less que se extienda la class
  • ¿Cuándo debería usar let {} y cuando simplemente! = Null
  • Obtiene N últimos objects emitidos por observables en RxJava2
  • Comience la actividad de kotlin * .kt desde la actividad de java * .java?
  • La function en línea no puede acceder a API no pública: @PublishedApi vs @Suppress vs @JvmSynthetic
  • Kotlin-js: define el número de decimales
  • Copia defensiva de una colección mutable en la class de datos Kotlin
  • Error: ejecución fallida para la tarea ': app: compileDebugKotlinAfterJava'
  • ¿Kotlin proporciona mejoras en el performance?
  • Spring Boot inserta datetime no válido en MariaDB da como resultado nulo, en campo no anulable
  • ¿Kotlin estructural equality check super types?