Trabajar con java.time en Kotlin: amor, dolor, sufrimiento

Un micropost sobre cómo puede engañarse a sí mismo cuando usa la función Kotlin: la capacidad de trabajar con operadores de comparación como Comparable.





Aquellos que usan Kotlin no pudieron evitar apreciar la sobrecarga del operador (bueno, más precisamente, cómo se hace), aunque diré que viví en Java y está bien sin él, pero no se trata de esta característica del lenguaje, sino de el que se basa en él: Operaciones de comparación. Aquí es cuando los signos de comparación se pueden aplicar a las clases que implementan Comparable, que es azúcar, pero muy agradable.





Entonces, practiquemos con sintéticos: tenemos algún tipo de período de tiempo, es decir, fecha y hora de inicio y finalización y debemos comprobar el hecho de la intersección de los intervalos de tiempo.





En Java (escribo lo más brevemente posible y sin normas aceptadas, solo transmito la idea):





class TimeIterval {
  LocalDateTime from;
  LocalDateTime to;
}
class TimeIntervalUtil {
  public boolean areOverlapped(TimeInterval first, TimeInterval second) {
            return (first.from.isEqual(second.to) || first.from.isBefore(second.to)) &&
                (first.to.isEqual(second.from) || first.to.isAfter(second.from));
  }
}
      
      



esos. nada complicado, pero por si acaso explicaré el código (tengo que explicarme este código cuando lo encuentre): la intersección de dos intervalos es posible solo si la fecha de inicio de uno vino antes o al mismo tiempo en relación a la fecha de finalización del segundo y, al mismo tiempo, la fecha de finalización del primer intervalo es posterior o al comienzo del segundo.





Ahora lo mismo pero en Kotlin con su azúcar, pero sin los guardabosques:





data class TimeInterval(val from: LocalDateTime, val to: LocalDateTime)
fun areOverlapped(first: TimeInterval, second: TimeInterval): Boolean = 
  first.from <= second.to && first.to >= second.from
      
      



Bueno, creo que sin comentarios donde se puede ver mejor, lo que es más agradable de usar y entender más rápido. Satisfechos, vamos a Kotlin y comenzamos a trabajar por analogía con OffsetDateTime.





, OffsetDateTime. Comparable, java.time. LocalDateTime. Java , .





compareTo, Kotlin , LocalDateTime ( , , ), .





OffsetDateTime , , compareTo , .. 2021-04-25 10:00+0 2021-04-25 11:00+1 . :





val inUtc = OffsetDateTime.of(LocalDateTime.of(2021, 4, 25, 10, 0), ZoneOffset.UTC)
val inUtc1 = OffsetDateTime.of(LocalDateTime.of(2021, 4, 25, 11, 0), ZoneOffset.ofTotalSeconds(60*60))
println(inUtc1>=inUtc && inUtc1 <= inUtc)
println(inUtc.isEqual(inUtc1))
      
      



Por supuesto, es correcto usar no isEqual aquí, pero - == y generalmente separados isEqual + isBefore + isAfter y Comparable + equal, pero desafortunadamente a veces tiendo a no notar la diferencia, especialmente cuando tengo un enfoque conveniente con operadores de comparación .





Así es como puede crear fácil y naturalmente un error no obvio en el caso de un uso irreflexivo de operadores de comparación en Kottlein con la api java.time.








All Articles