package org.yajul.util; /** * Caches an object. The delegate ObjectProvider is only called once. * Thread safe. * <br> * User: josh * Date: 6/28/11 * Time: 11:53 AM */ public class CachedObjectProvider<T> implements ObjectProvider<T> { private T cached; private ObjectProvider<T> delegate; public CachedObjectProvider(ObjectProvider<T> delegate) { this.delegate = delegate; } public T getObject() { synchronized (this) { if (cached == null) cached = create(); return cached; } } /** * Sub-classes can override this to do any initialization after looking up the object. * * @return the newly looked-up object */ protected T create() { return delegate.getObject(); } }