내가 enum의 hashCode로 실수한 방법
Feed
)는 간단했습니다.data class Feed(
val deviceId: String,
val platform: Platform,
val items: List<FeedItem>
)
enum class Platform {
IOS, ANDROID
}
data class FeedItem(
val id: Int
// Integers and strings
)
ETag에
hashCode()
를 사용하기로 했습니다.나는
Integer
와 String
모두 잘 정의되고 안정적인 해시 코드를 가지고 있다는 것을 알고 있었습니다. Integer#hashCode()
은 요소에 안정적인 해시 코드가 있는 한 안정적입니다.Integer
물론 아닙니다. 우리는 행복하지 않습니다!
String#hashCode()
메서드에 대한 세부 정보를 확인하는 것을 잊었습니다.그리고 여기에 용이 있습니다. enum의 해시 코드는 다른 JVM 인스턴스에서 안정적이지 않습니다. 값의 , 즉
List#hashCode()
로 계산된다고 잘못 가정했습니다. 이 값은 그 자체와 동일한 안정적인 해시 코드를 가집니다. 하지만 그렇지 않습니다. Enum의 해시 코드는 Java에서 다음과 같이 정의됩니다(Kotlin은 거의 동일함).public final int hashCode() {
return super.hashCode();
}
여기서
Enum#hashCode()
는 ordinal()
이고, Integer
, super
의 해시코드는 객체 자체가 변경되지 않는 한 안정적이다. 일반적으로 열거형의 경우입니다. JVM당 각 열거형 값의 인스턴스가 하나만 있고 안정적입니다. 그러나 단일 JVM에 적용된다는 점을 강조하는 것이 중요합니다. 다른 JVM의 Enum은 다른 해시 코드를 갖습니다.이것이 우리의 ETag가 고장난 방식입니다. 요청이 새 서버에 도착할 때마다 데이터베이스에 저장된 개체가 동일하더라도 ETag가 달라졌습니다. 수명이 짧은 JVM(
Object
)을 사용하고 있다는 사실로 상황이 악화되어 이 문제를 추적하기 전까지 한동안 캐싱이 완전히 중단되었습니다.RTFM!
Reference
이 문제에 관하여(내가 enum의 hashCode로 실수한 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/madhead/how-i-blundered-with-enum-s-hashcode-4keb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)