Равные ключи вызывают нагрузку на кеш больше, чем ожидалось

Может быть, я полностью заблуждаюсь о том, как работает cache2k. Я хочу кешировать результаты очень дорогих операций, но даже при одинаковых ключах результаты всегда генерируются снова. Сначала я подумал, что ключи на самом деле не равны, но даже с помощью функции equals(), возвращающей значение true, кеш, кажется, думает, что я хочу новых результатов.

import org.cache2k.Cache;
import org.cache2k.CacheBuilder;
import org.cache2k.integration.CacheLoader;
import org.junit.Test;

import java.util.Date;
import java.util.concurrent.TimeUnit;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

public class MyCacheTest {

  private static int count = 0;

  Cache<MyCacheTest.MyKey, Integer> cache = (Cache) CacheBuilder.newCache(MyCacheTest.MyKey.class,
      Integer.class)
      .expiryDuration(1, TimeUnit.HOURS)
      .loader(new CacheLoader<MyCacheTest.MyKey, Integer>() {
        @Override
        public Integer load(MyCacheTest.MyKey p) throws Exception {
          return costlyOperation(p);
        }
      })
      .build();

  private Integer costlyOperation(MyKey p) {
    count ++;
    return 1;
  }

  public class MyKey {

    Date date;

    @Override
    public boolean equals(Object o) {
      return true;
    }
  }

  // OK
  @Test
  public void testEquals() {
    assertTrue(new MyKey().equals(new MyKey()));
  }

  // FAIL, somehow calls costlyOperation twice
  @Test
  public void testCostlyOperationCalledOnlyOnce() {
    cache.get(new MyKey());
    cache.get(new MyKey());
    assertEquals(count, 1);
  }
}

Это скорее всего недоразумение с моей стороны, кто-то, пожалуйста, объясните, почему это не работает так, как я ожидаю.

1 ответ

Решение

Вы реализовали equals но нет hashCode и эта реализация кеша использует hashCode, Добавление:

@Override
public int hashCode() {
    return 0;
}

в MyKey дает ожидаемое поведение.

(протестировано с версией 0.26-BETA)

Другие вопросы по тегам