相等的键触发缓存负载超过预期

equal keys trigger cache load more than expected

也许我完全误会了 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);
  }
}

这很可能是我的误会,请有人解释为什么这不像我预期的那样有效。

您实施了 equals 但未实施 hashCode,并且此缓存实施使用 hashCode。 添加:

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

MyKey 给出了预期的行为。

(使用 0.26-BETA 版测试)