मैं एक साधारण 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)
के मामले में सुरक्षित प्रकार हो सकता है?
एकमात्र चीज जिसे मैं सोच सकता हूं, i.e. getValue(Key k)
नामक एक और विधि बनाना है जो get(Object key)
पर प्रतिनिधि होगा, लेकिन फिर मैं किसी को सामान्य की बजाय नई विधि का उपयोग करने के लिए मजबूर नहीं कर सकता।
आप 'getA' या' myget' को लागू कर सकते हैं आप मानचित्र के व्यवहार को नहीं बदल सकते हैं।प्राप्त करें() क्योंकि आप कोड को मजबूर नहीं कर सकते हैं जो आपकी कक्षा के बजाय इंटरफ़ेस का उपयोग सीधे पुन: संकलित करने के लिए करता है। –