Kotlin機能を使用するときに自分をだます方法についてのマイクロポスト:Comparableなどの比較演算子を操作する機能。
Kotlinを使用する人は、演算子のオーバーロード(より正確には、それがどのように行われるか)を理解せずにはいられませんでしたが、私はJavaに住んでいて、Javaがなくても問題ありませんが、これはこの言語機能に関するものではなく、それに基づくもの:比較操作。これは、比較記号をComparableを実装するクラスに適用できる場合です。Comparableは砂糖ですが、非常に優れています。
それでは、合成繊維について練習しましょう。ある種の期間があります。開始日時と終了日時。時間間隔が交差していることを確認する必要があります。
Javaの場合(私はできるだけ簡潔に、受け入れられた規範なしで、アイデアを伝えるだけです):
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));
}
}
それら。複雑なことは何もありませんが、コードを説明する場合に備えて(このコードに出会ったときに自分自身に説明する必要があります):2つの間隔の交差は、一方の開始日が早いか、または同時に関係している場合にのみ可能です2番目の終了日になり、同時に最初の間隔の終了日が遅くなるか、2番目の開始になります。
同じことですが、Kotlinで砂糖を使用していますが、レンジャーは使用していません。
data class TimeInterval(val from: LocalDateTime, val to: LocalDateTime)
fun areOverlapped(first: TimeInterval, second: TimeInterval): Boolean =
first.from <= second.to && first.to >= second.from
さて、コメントなしで、あなたがよりよく見ることができるところ、何がより速く使いそして理解するのがより楽しいかと思います。満足したら、Kotlinに移動し、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))
もちろん、ここではisEqualではなく、-==を使用するのが正しいですが、一般的にisEqual + isBefore + isAfterとComparable + equalを分離しますが、残念ながら、特に比較演算子を使用した便利なアプローチがある場合は、違いに気付かない傾向があります。 。
これは、Java.time APIを使用してKottleinで比較演算子を無意識に使用した場合に、簡単かつ自然に明白なバグを作成する方法です。