2012-12-01 6 views
15

Was ist das richtige Paradigma oder Dienstprogramm Klasse (scheint nicht zu finden, eine bereits existierende Klasse), um einen faulen Lieferanten in Java zu implementieren?Implementierung eines Lazy Supplier in Java

Ich möchte etwas haben, das das Compute-Once/Cache-Late-Verhalten behandelt und mir erlaubt, das Berechnungsverhalten unabhängig zu spezifizieren. Ich weiß, dass dies wahrscheinlich einen Fehler hat, aber es hat die richtige Semantik:

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

Das sieht gut aus, was stört dich? –

+1

Ich weiß, dass Nebenläufigkeit nicht etwas ist, mit dem man sich anlegt, wenn man nicht wirklich die richtigen Schritte unternimmt, um sicherzustellen, dass es korrekt ist. –

+0

Der hier gezeigte Beispielcode ist ein doppeltes Checked Locking und ist eine schlechte Übung, wie in http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html beschrieben –

Antwort

28

Diese bereits in Suppliers.memoize Verfahren umgesetzt wird.

+1

kein Wunder, ich konnte keine Klasse finden, es ist eine statische Methode - danke! –