2010-09-02 15 views
17

मुझे इस एक http://onjava.com/pub/a/onjava/2003/08/20/memoization.html पता है लेकिन क्या कुछ और है?जावा में ज्ञापन के लिए विभिन्न तकनीकें क्या हैं?

+1

यह उदाहरण प्रॉक्सी के माध्यम से ऑब्जेक्ट के सभी तरीकों पर ज्ञापन करता है। लेकिन उस समय सामान्य यादें एक समारोह है। जब आप ऑब्जेक्ट के सभी तरीकों को याद नहीं करना चाहते हैं तो वह प्रॉक्सी तकनीक परेशान होगी। – lacroix1547

उत्तर

11

Memoization भी सादा सरल typesafe जावा के साथ आसान है।

आप इसे निम्नलिखित पुन: प्रयोज्य वर्गों के साथ खरोंच से कर सकते हैं।

मैं इन्हें उन कैश के रूप में उपयोग करता हूं जिनकी उम्र वेबपैप पर अनुरोध है।

बेशक यदि आप एक बेदखल रणनीति या सिंक्रनाइज़ेशन जैसी अधिक सुविधाओं की आवश्यकता है तो गुवा MapMaker का उपयोग करें।

यदि आपको कई पैरामीटर के साथ एक विधि को याद करने की आवश्यकता है, तो पैरामीटर को दोनों तकनीकों के साथ सूची में रखें, और उस सूची को एकल पैरामीटर के रूप में पास करें।

abstract public class Memoize0<V> { 
    //the memory 
    private V value; 
    public V get() { 
     if (value == null) { 
      value = calc(); 
     } 
     return value; 
    } 
    /** 
    * will implement the calculation that 
    * is to be remembered thanks to this class 
    */ 
    public abstract V calc(); 
} 

abstract public class Memoize1<P, V> { 
    //The memory, it maps one calculation parameter to one calculation result 
    private Map<P, V> values = new HashMap<P, V>(); 

    public V get(P p) { 
     if (!values.containsKey(p)) { 
      values.put(p, calc(p)); 
     } 
     return values.get(p); 
    } 

    /** 
    * Will implement the calculations that are 
    * to be remembered thanks to this class 
    * (one calculation per distinct parameter) 
    */ 
    public abstract V calc(P p); 
} 

और यह इस

Memoize0<String> configProvider = new Memoize0<String>() { 
     @Override 
     public String calc() { 
      return fetchConfigFromVerySlowDatabase(); 
     } 
    }; 
    final String config = configProvider.get(); 

    Memoize1<Long, String> usernameProvider = new Memoize1<Long, String>() { 
     @Override 
     public String calc(Long id) { 
      return fetchUsernameFromVerySlowDatabase(id); 
     } 
    }; 
    final String username = usernameProvider.get(123L); 
+0

अमरूद अभी तक हमारे पर्यावरण, वित्तीय सॉफ्टवेयर के लिए अनुमोदित नहीं है ... – ranv01

+0

अमरूद अभी तक हमारे पर्यावरण के लिए स्वीकृत नहीं है। बैंकिंग सॉफ्टवेयर ... लेकिन यह करेगा। हालांकि मैमोरी लीक से बचने के लिए मैप के आकार को सीमित कर दूंगा। मुझे बेदखल करने की परवाह नहीं है क्योंकि यह केवल एक विधि के आविष्कार के दौरान संरक्षित होगा। – ranv01

+33

मुझे पसंद है कि अत्यधिक परीक्षण कोड अनुमोदित नहीं है, लेकिन SO पर चिपका हुआ कुछ है :) –

14

हां। से caches का उपयोग करें।

उदाहरण:

import java.math.BigInteger; 

import com.google.common.base.Preconditions; 
import com.google.common.cache.CacheBuilder; 
import com.google.common.cache.CacheLoader; 
import com.google.common.cache.LoadingCache; 

public class Fibonacci { 
    private static final LoadingCache<Integer, BigInteger> CACHE 
      = CacheBuilder.newBuilder().build(CacheLoader.from(Fibonacci::fib)); 

    public static BigInteger fib(int n) { 
     Preconditions.checkArgument(n >= 0); 
     switch (n) { 
     case 0: 
      return BigInteger.ZERO; 
     case 1: 
      return BigInteger.ONE; 
     default: 
      return CACHE.getUnchecked(n - 1).add(CACHE.getUnchecked(n - 2)); 
     } 
    } 
} 
+7

मैपमेकर अब कैशबिल्डर के पक्ष में बहिष्कृत है: https://code.google.com/p/guava-libraries/wiki/MapMaker माइग्रेशन – dzieciou

+2

@dzieciou मैंने आखिरकार कोड को अपडेट किया है जो नवीनतम गुवा (18.0 पर काम करता है) लेखन का वर्तमान समय)। और इस बार, यह परीक्षण किया गया है! –

16

की तरह प्रयोग किया जाता है पैरामीटर के बिना कार्यों memoize करने के लिए, अमरूद के Suppliers.memoize(Supplier) का उपयोग करें। पैरामीटर के साथ कार्यों के लिए, पैरामीटर मान ऑब्जेक्ट्स के साथ CacheBuilder.build(CacheLoader) का उपयोग कुंजी के रूप में करें।

+0

यह भी देखें https://github.com/google/guava/wiki/CachesExplained – Vadzim

+0

ज्ञापन उदाहरण: https://stackoverflow.com/questions/3636244/thread-safe-cache-of-one-object-in-java/ 3636791 # 3636791 – Vadzim

संबंधित मुद्दे