Sebuah micropost tentang bagaimana Anda dapat menipu diri sendiri saat menggunakan fitur Kotlin: kemampuan untuk bekerja dengan operator perbandingan seperti Comparable.
Mereka yang menggunakan Kotlin tidak dapat membantu tetapi menghargai operator yang kelebihan beban (yah, lebih tepatnya, bagaimana hal itu dilakukan), meskipun saya akan mengatakan saya tinggal di Java dan tidak apa-apa tanpanya, tetapi ini bukan tentang fitur bahasa ini, tetapi tentang yang didasarkan padanya: Operasi Perbandingan. Ini adalah saat tanda perbandingan dapat diterapkan ke kelas yang mengimplementasikan Comparable, yang merupakan gula, tapi sangat bagus.
Jadi, mari kita berlatih tentang sintetis: kita memiliki semacam periode waktu, mis. tanggal dan waktu mulai dan berakhir dan kita perlu memeriksa fakta persimpangan interval waktu.
Di Jawa (saya tulis sesingkat mungkin dan tanpa norma yang berlaku, cukup sampaikan idenya):
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));
}
}
itu. tidak ada yang rumit, tetapi untuk berjaga-jaga jika saya akan menjelaskan kodenya (saya harus menjelaskan kode ini kepada diri saya sendiri ketika saya bertemu dengannya): persimpangan dua interval hanya mungkin jika tanggal mulai salah satu datang lebih awal atau pada waktu yang sama dalam hubungannya ke tanggal akhir kedua dan pada saat yang sama tanggal akhir dari interval pertama datang kemudian atau di awal detik.
Sekarang hal yang sama tetapi di Kotlin dengan gula, tetapi tanpa penjaga:
data class TimeInterval(val from: LocalDateTime, val to: LocalDateTime)
fun areOverlapped(first: TimeInterval, second: TimeInterval): Boolean =
first.from <= second.to && first.to >= second.from
Yah, saya pikir tanpa komentar di mana Anda bisa melihat lebih baik, apa yang lebih menyenangkan untuk digunakan dan lebih cepat dipahami. Puas, kami pergi ke Kotlin dan mulai bekerja dengan analogi dengan 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))
Tentu saja, benar menggunakan not isEqual di sini, tetapi - == dan umumnya memisahkan isEqual + isBefore + isAfter dan Comparable + equal, tetapi sayangnya saya terkadang cenderung tidak memperhatikan perbedaannya, terutama ketika saya memiliki pendekatan yang nyaman dengan operator perbandingan .
Ini adalah bagaimana Anda dapat dengan mudah dan alami membuat bug yang tidak terlihat dalam kasus penggunaan operator perbandingan yang sembrono di Kottlein dengan api java.time.