2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[Item 7] LinkedHashMap의 removeEldestEnty 동작 방식 #21

Closed gmelon closed 1 year ago

gmelon commented 1 year ago

본문에 캐시 엔트리의 유효 기간을 정확히 정의하기 어렵기 때문에 시간이 지날 수록 엔트리의 가치를 떨어뜨리는 방식을 흔히 사용 (중략) LinkedHashMap은 removeEldestEntry 메서드를 써서 후자의 방식으로 처리한다 라고 되어 있는데 LinkedHashMap은 그럼 오래 사용되지 않은 엔트리를 점차 삭제하고 있는 건지?

gmelon commented 1 year ago

오.. 당연하게도(?) LinkedHashMap은 entry를 자기 맘대로 삭제하거나 하는 극악무도한 짓은 하지 않네요

LinkedHashMap.removeEldestEntry() 입니다

protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
    return false;
}

그런데 자바에서 제공하는 캐시 클래스들이 LinkedHashMap을 상속받고 저 메서드를 상황에 맞게 재정의해서 사용하도록 구현되나봐요 예를 들어 FileMemData의 내부 클래스 Cache는 아래와 같이 재정의하고 있습니다

@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
    if (size() < size) {
        return false;
    }
    CompressItem c = (CompressItem) eldest.getKey();
    c.file.compress(c.page);
    return true;
}

참 알면 알수록 신기한 자바세상입니당