केन के उत्तर के आगे, यदि हेवीवेट ऑब्जेक्ट बनाना जो बाद में फेंक दिया जाता है तो स्वीकार्य नहीं है (आप गारंटी देना चाहते हैं कि प्रत्येक कुंजी के लिए केवल एक वस्तु बनाई जाती है, किसी कारण से), तो आप इसे कर सकते हैं .. .. वास्तव में, मत करो। इसे स्वयं मत करो। का प्रयोग करें google-collections (अब guava) MapMaker class:
Map<KeyType, HeavyData> cache = new MapMaker<KeyType, HeavyData>()
.makeComputingMap(new Function<KeyType, HeavyData>() {
public HeavyData apply(KeyType key) {
return new HeavyData(key); // Guaranteed to be called ONCE for each key
}
});
फिर एक सरल cache.get(key)
सिर्फ काम करता है और पूरी तरह से संगामिति और syncrhonization की मुश्किल पहलुओं के बारे में चिंता करने की ज़रूरत नहीं आप निकाल देता है।
ध्यान दें कि आप समाप्ति की तरह, कुछ अधिक सजावटी सुविधाओं जोड़ना चाहते हैं, यह सिर्फ
Map<....> cache = new MapMaker<....>()
.expiration(30, TimeUnit.MINUTES)
.makeComputingMap(.....)
है और आप भी आसानी से या तो चाबी या डेटा के लिए नरम या कमजोर मूल्यों का उपयोग कर सकते हैं यदि आवश्यक हो (अधिक के लिए जावाडोक देखना विवरण)
बस सोच रहा है: कैशिंग के लिए वास्तव में आपकी क्या आवश्यकताएं हैं? क्या आपको अपने भारी वजन वस्तु के पूर्ण संक्रमण को बंद करने की आवश्यकता है ताकि यह आपके एप्लिकेशन सर्वर के समूह में सुसंगत हो? यदि ऐसा है, तो यह हल करने के लिए एक गैर-मामूली समस्या है, और आप कैश लाइब्रेरी का उपयोग करके बेहतर हो सकते हैं जैसे ehcache। – Alan