tutorial español ejemplos compiler kotlin

español - kotlin vs java



Que hace ?. significa en Kotlin cuando se usa en el lado izquierdo de una tarea? (2)

Según los documentos de Kotlin , el?. operador representa una ''llamada segura'', lo que significa que si se usa en una cadena de llamadas a métodos, toda la cadena devolverá el valor nulo si el valor de lo que sea que se use es nulo.

¿Pero qué pasa si se usa en el lado izquierdo de una tarea? Como el lado izquierdo no es el lado que está "devolviendo" nada, parece que probablemente tenga un efecto diferente. Aquí hay un ejemplo de lo que estoy hablando:

val myObj = SomeObj() myObj?.property = SomeClass.someFunc() // What does ?. do in this context?


Estoy viendo una pregunta y respuesta divertida en Kotlin ahora mismo. Incluso si la respuesta es muy buena, pero quiero aclararla con más detalle.

La expresión de asignación a continuación:

myObj?.property = SomeClass.someFunc()

se transforma a código de bytes de Java por Kolin de la siguiente manera:

val it = myObj; if(it != null){ it.property = SomeClass.someFunc(); }

así que no hay problema en múltiples hilos. Todavía funciona bien y lo he probado en github . Pero dará como resultado el problema de interferencia de subprocesos , lo que significa que modificará la property en diferentes referencias cuando se cambie myObj .

Excepto que la expresión de asignación puede estar en cortocircuito , otras también pueden estar en cortocircuito . Por ejemplo:

val array:Array<Any>? = null; // v--- short-circuited array?.set(0,SomeClass.someFunc()); // ^--- never be called


Significa que si falla una de las llamadas seguras en el lado izquierdo (es decir, su receptor es nulo), se omite toda la asignación y la expresión en el lado derecho no se evalúa en absoluto.

val nullable: Container? = null nullable?.x = f() // f is not called

(demo ejecutable)