I가 (a 실패 단위 테스트와 함께) 클래스 다음 세트 :HashMap을 사용하여 캐시에서 같은 키에 동일한 객체를 반환하는 방법?
스프로킷 :
public class Sprocket {
private int serialNumber;
public Sprocket(int serialNumber) {
this.serialNumber = serialNumber;
}
@Override
public String toString() {
return "sprocket number " + serialNumber;
}
}
SlowSprocketFactory :
public class SlowSprocketFactory {
private final AtomicInteger maxSerialNumber = new AtomicInteger();
public Sprocket createSprocket() {
// clang, click, whistle, pop and other expensive onomatopoeic operations
int serialNumber = maxSerialNumber.incrementAndGet();
return new Sprocket(serialNumber);
}
public int getMaxSerialNumber() {
return maxSerialNumber.get();
}
}
SprocketCache :
public class SprocketCache {
private SlowSprocketFactory sprocketFactory;
private Sprocket sprocket;
public SprocketCache(SlowSprocketFactory sprocketFactory) {
this.sprocketFactory = sprocketFactory;
}
public Sprocket get(Object key) {
if (sprocket == null) {
sprocket = sprocketFactory.createSprocket();
}
return sprocket;
}
}
TestSprocketCache 단위 테스트 :
,public class TestSprocketCache {
private SlowSprocketFactory sprocketFactory = new SlowSprocketFactory();
@Test
public void testCacheReturnsASprocket() {
SprocketCache cache = new SprocketCache(sprocketFactory);
Sprocket sprocket = cache.get("key");
assertNotNull(sprocket);
}
@Test
public void testCacheReturnsSameObjectForSameKey() {
SprocketCache cache = new SprocketCache(sprocketFactory);
Sprocket sprocket1 = cache.get("key");
Sprocket sprocket2 = cache.get("key");
assertEquals("cache should return the same object for the same key", sprocket1, sprocket2);
assertEquals("factory's create method should be called once only", 1, sprocketFactory.getMaxSerialNumber());
}
}
TestSprocketCache 단위 테스트는 항상 내가 변경하는 경우에도 녹색 막대를 돌려 다음과 같이 다음
Sprocket sprocket1 = cache.get("key");
Sprocket sprocket2 = cache.get("pizza");
오전 내가 SprocketCache.get 내부 (키)를 HashMap.contains를 (사용한다는 것을 추측) 방법을 사용하지만 논리를 이해하는 것처럼 보일 수는 없습니다.
당신은 * HashMap을 사용하고 있지 않습니다. * 문제입니다. * 당신이 무엇을 요구하고 있는지 분명하지 않습니다. – EJP