Kotlin comtesting null dos veces en caso de que no

Tengo un artículo con variable datePurchased , que puede ser nulo. En function de la date de compra, genero una label. Cuando compruebo si la dateComprada es nula, en la twig else aún tengo que verificar si hay nulo. Dice que el reparto inteligente es imposible, porque es una propiedad mutable.

Esto es lo que he intentado hasta ahora:

 if (datePurchased == null) { "" } else { if (datePurchased.isToday()) {//error here } } when { datePurchased == null -> { } datePurchased.isToday() -> {//smart cast bla bla mutable bla bla datePurchased?.isToday() -> {//expected Boolean, got Boolean? datePurchased?.isToday()?:false -> {//all good, but does not look nice, since datePurchased can't be null here } else -> { } } 

Gracias a Marstran, terminé con esa solución:

  return datePurchased?.let { when { it.isToday() -> { "Today" } it.isYesterday() -> { "Yesterday" } else -> { dateFormat.format(it) } } } ?: "" 

Si está seguro de que no tiene datos de raza en los que la date de datePurchased sea null , agregue una afirmación no nula en la twig else :

 if (datePurchased == null) { "" } else { datePurchased!!.isToday() } 

O más corto y más confiable:

 datePurchased?.isToday() ?: "" 
  1. La date de compra es mutable, lo que significa que se puede cambiar.

  2. Su código no se ejecuta dentro de ningún tipo de locking síncrono, lo que significa que otro hilo podría estar ejecutándose y modificándolo al mismo time.

Con esto en mente, lo siguiente es posible:

 if (datePurchased == null) { ... } else { // another thread comes in here and changes datePurchased=null if (datePurchased.isToday()) { // Null Pointer Exception! ... } } 

Puede que no tengas ningún hilo haciendo esto, pero el comstackdor no sabe. Se juega seguro y dice que no se puede hacer esto. Probablemente el 98% de las veces está mal pero ese otro 2% lo obliga a pensar cómo se comporta su código en un entorno concurrente.

Una solución es simplemente usar un valor local que no se puede cambiar en un nuevo hilo:

 val datePurchased = datePurchased if (datePurchased == null) { ... } else { // datePurchased val cannot have been changed, compiler can guarantee safety if (datePurchased.isToday()) { ... } } 

Pero lo principal es que ahora debe pensar en lo que realmente significa inmutable en el context de su aplicación, y si realmente necesita tener variables mutables.