我正在寫一個簡單的基於HashMap
緩存的工作原理如下:爪哇 - 擴展的HashMap - 對象對仿製藥的行爲
- 如果請求
key
在高速緩存,返回其value
。 - 如果請求
key
不有,運行基於key
產生value
的方法,同時存儲,返回value
。
代碼:
import java.util.HashMap;
abstract class Cache<K, V> extends HashMap<K, V> {
@Override
public V get(Object key) {
if (containsKey(key)) {
return super.get(key);
} else {
V val = getData(key);
put((K)key, val); // this is the line I'm discussing below
return val;
}
}
public abstract V getData(Object key);
}
這是非常簡單和行之有效的。然而,我討厭太陽的get()
決定採取Object
作爲其論點,而不是K
。我已經讀了足夠多的信息,知道它背後有一些基本原理(我不同意,但那是另一回事)。
我的問題是在註釋行中,因爲它看起來像已經被取消選中。由於類型刪除,我無法檢查key
是否爲K
(正確需要put()
功能),因此該方法容易出錯。
一個解決辦法是從開關「是一個」到「有」 HashMap
關係是更漂亮,乾淨,但隨後Cache
無法實現Map
這將是有幾個原因不錯。代碼:
import java.util.HashMap;
import java.util.Map;
abstract class Cache<K, V> {
private final Map<K, V> map = new HashMap<K, V>();
public V get(K key) {
if (map.containsKey(key)) {
return map.get(key);
} else {
V val = getData(key);
map.put(key, val);
return val;
}
}
public abstract V getData(K key);
}
任何人都可以拿出任何其他(甚至hackish的)解決方案,這樣我可以保持Cache
是一個Map
,仍然是類型的get(Object key)
和put(K key, V val)
條款安全嗎?
我唯一能想到的就是製作另一個名爲getValue(Key k)
的方法,它將委託給get(Object key)
,但我不能強迫任何人使用新方法而不是通常的方法。
你可以實現'getA'或'myget'你不能改變Map的行爲。get()儘可能不能強制直接使用接口而不是類直接重新編譯的代碼。 – 2012-04-27 16:14:07