2012-12-01 12 views
15

Qual è il paradigma o classe di utilità corretto (non riesco a trovare una classe preesistente) per implementare un fornitore pigro in Java?implementazione di un fornitore pigro in java

Voglio avere qualcosa che gestisca il comportamento di compute-una volta/cache-dopo e mi permetta di specificare il comportamento del calcolo in modo indipendente. So che questo è probabilmente un errore, ma ha la semantica giusti:

abstract public class LazySupplier<T> implements Supplier<T> 
{ 
    private volatile T t; 
    final private Object lock = new Object(); 

    final public T get() { 
     if (t == null) 
     { 
      synchronized(lock) 
      { 
       if (t == null) 
        t = compute(); 
      } 
     } 
     return t; 
    } 
    abstract protected T compute(); 
} 
+1

Mi sembra carino, cosa ti dà fastidio? –

+1

So che la concorrenza non è qualcosa con cui si scherza a meno che non si adottino i giusti passaggi per assicurarsi che sia corretta. –

+0

Il codice di esempio mostrato qui è un doppio controllo ckecked ed è una cattiva pratica come descritto in http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html –

risposta

28

Questo è già implementata in Suppliers.memoize metodo.

+1

non mi meraviglia che non sia riuscito a trovare una lezione, è un metodo statico - grazie! –