Kotlin value class 및 operator override 를 이용한 버전 비교
전제조건
버전값은 콤마(.) 로 구분하며 숫자만 이용할 수 있다.
operator 의 경우 >, <, >=, <= 를 이용할 수 있다.
소스코드
@JvmInline
value class VersionNumber(private val ver: String) {
operator fun compareTo(right: VersionNumber): Int {
if (ver == right.ver) return 0
var comparisonResult = 0
val splitRegex = "\\.".toRegex()
val lefts: List<String> = this.ver.split(splitRegex)
val rights: List<String> = right.ver.split(splitRegex)
val maxLengthOfVersionSplits = lefts.size.coerceAtLeast(rights.size)
for (i in 0 until maxLengthOfVersionSplits) {
val leftVersion = parseNumber(i, lefts)
val rightVersion = parseNumber(i, rights)
val compare = leftVersion.compareTo(rightVersion)
if (compare != 0) {
comparisonResult = compare
break
}
}
return comparisonResult
}
private fun parseNumber(i: Int, splits: List<String>): Int {
return if (i < splits.size) {
splits[i]
.replace("[^0-9]".toRegex(), "")
.toIntOrNull()
?: 0
} else 0
}
}
테스트 코드
class VersionNumberTest {
@Test
fun simpleTest() {
assertThat(VersionNumber("1.0.0") >= VersionNumber("1.0.0")).isTrue
assertThat(VersionNumber("1.0.0") <= VersionNumber("1.0.0")).isTrue
assertThat(VersionNumber("1.0.0") < VersionNumber("1.0.1")).isTrue
assertThat(VersionNumber("1.0.1") > VersionNumber("1.0.0")).isTrue
}
}
'SpringBoot' 카테고리의 다른 글
profiles 를 이용한 aws iam 과 secret key 기반 인증 설정 (0) | 2023.06.26 |
---|---|
Spring 6 의 HTTP Interface (0) | 2023.03.14 |
Retrying Feign Calls (0) | 2023.03.14 |
RedisTemplate 과 Json Serializer 설정 (0) | 2019.07.09 |
MongoDB _class 필드 제거하기 (0) | 2019.07.09 |