Sé un poco de java y actualmente estoy estudiando kotlin. No puedo descifrar captadores. Tengo una clase y alguna función.
class Client(val personalInfo: PersonalInfo?){} //class fun sendMessageToClient(client: Client?) { val personalInfo: PersonalInfo? = client?.personalInfo //... } Según tengo entendido, getter se llama en el código client?.personalInfo . ¿O es un campo de clase, ya que privado no se especifica explícitamente en ninguna parte?
A continuación, quiero agregar algo de lógica al captador, pero aparece un error de que ya existe dicha firma.
class Client(val personalInfo: PersonalInfo?){ fun getPersonalInfo():PersonalInfo?{ print(personalInfo) return personalInfo } } Si especifico que el campo es privado, desaparece el error class Client(private val personalInfo: PersonalInfo?) , pero pero el código client?.personalInfo no funcionará
Traté de reescribir el código, pero no puedo averiguar cómo especificar val y pasarle un valor del constructor.
class Client(personalInfo: PersonalInfo?) { val personalInfo = //?? get() { print("personal info $personalInfo") return personalInfo } } ¿Es posible agregar de alguna manera print al getter y aún usar client?.personalInfo ?
Casi estabas allí. Al crear captadores personalizados en kotlin, debe usar el field de palabra clave cuando desee que se use el valor de la propiedad asociada (puede leer más sobre esto en la documentación de referencia en https://kotlinlang.org/docs/properties.html# backing-fields o en https://www.baeldung.com/kotlin/getters-setters#1-accessing-the-backing-field ):
Cada propiedad que definimos está respaldada por un campo al que solo se puede acceder dentro de sus métodos get() y set() usando la palabra clave de campo especial. La palabra clave de campo se utiliza para acceder o modificar el valor de la propiedad. Esto nos permite definir una lógica personalizada dentro de los métodos get() y set().
Habiendo escrito esto, solo necesita cambiar su código un poco de la siguiente manera:
class Client(personalInfo: String?) { val personalInfo: String? = personalInfo get() { print("personal info $field") return field } }