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()) 
  • Resalta múltiples elementos en la vista de list de Android cuando se selecciona
  • Kotlin Oither mónada: refactorización de una llamada de constructor para manejar CPS
  • La function en línea no puede acceder a API no pública: @PublishedApi vs @Suppress vs @JvmSynthetic
  • Spring PropertySources cargado pero no aplicado en Pruebas
  • kotlin obtiene vista desde el encabezado NavigationView
  • anko doAsync onComplete
  • ¿Cuál es la forma correcta de declarar el tipo de variable en Android con Kotlin?
  • ¿Qué es un MapRowParser simple en Anko?
  • Arquitectura limpia: ViewModel con múltiples UseCases en Android
  • Vert.x Kotlin Type Mismatch requinetworking Controlador <AsyncResult <Unit >> found (Handler <AsyncResult <Unit >>) -> Unidad
  • FusedLocationProviderClient con el service Android Kotlin