개발을 할 때 데이터 정렬을 위해 Comparator 사용이 필요할 경우가 있다.
'java.lang.IllegalArgumentException: Comparison method violates its general contract!' 에러의 경우 Collection 사용 중 정렬을 위해 Comparator를 사용할 경우 return 값의 정의를 명확히 해줘야 한다는 내용이다.
해결 방법은 나와있는 그대로이다. Comparator의 return 값을 모든 상황에 맞게 전단해주는 것이다. 두 값을 비교하는 것이기 때문에 A 데이터와 B 데이터 중 한 쪽이 크거나, 혹은 두 값이 같은 경우, 모두 명시를 해줘야 하는 것이다.(Java 9에서 해당 오류가 수정되었다고 한다.)
아래는 kotlin.comparisons 패키지의 Comparisons.kt의 compareValues() 메서드를 발췌한 것이다.
package kotlin.comparisons
//Comparisons.kt 내 소스입니다.
...
/**
* Compares two nullable [Comparable] values. Null is considered less than any value.
*
* @sample samples.comparisons.Comparisons.compareValues
*/
public fun <T : Comparable<*>> compareValues(a: T?, b: T?): Int {
if (a === b) return 0
if (a == null) return -1
if (b == null) return 1
@Suppress("UNCHECKED_CAST")
return (a as Comparable<Any>).compareTo(b)
}
...
위 코드를 보게 되면 모든 경우에 대해 리턴 값을 명시해줬다.
따라서 Comparator 구성 시 원하는 정렬 값에 맞게 return 값을 명시해줘야 에러 발생을 방지할 수 있다.