17

Javaで怠惰なサプライヤを実装するための正しいパラダイムまたはユーティリティクラス(既存のクラスを見つけることができないようです)は何ですか?

計算の1回/キャッシュの後での動作を処理し、計算の動作を個別に指定できるようにするものが必要です。これにはおそらくエラーがあることはわかっていますが、正しいセマンティクスがあります。

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();
}
4

2 に答える 2

36

これはすでにSuppliers.memoizeメソッドに実装されています。

public static <T> Supplier<T> memoize(Supplier<T> delegate)

get()への最初の呼び出し中に取得されたインスタンスをキャッシュし、get()への後続の呼び出しでその値を返すサプライヤを返します。参照:メモ化

返品されたサプライヤはスレッドセーフです。デリゲートのget()メソッドは最大で1回呼び出されます。サプライヤのシリアル化されたフォームには、キャッシュされた値が含まれていません。キャッシュされた値は、再シリアル化されたインスタンスでget()が呼び出されたときに再計算されます。

デリゲートが以前のメモ化の呼び出しによって作成されたインスタンスである場合、それは直接返されます。

于 2012-12-01T21:27:40.487 に答える
2

ApacheCommonsLangにはLazyInitializerがあります。

于 2013-11-08T17:47:30.313 に答える