2016-06-10 2 views
0

Возможно, я полностью ошибаюсь в работе cache2k. Я хочу кэшировать результаты из очень дорогостоящих операций, но даже с равными ключами результаты всегда генерируются снова. Сначала я подумал, что ключи не были одинаковыми, но даже с равным(), возвращающим 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); 
    } 
} 

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

ответ

2

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

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

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

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

+0

см., Просто глупое недоразумение, спасибо большое – globalworming

Смежные вопросы