content: /**
   * Copyright Alex Objelean
   */
  package ro.isdc.wro.util;
  
  
  
  /**
   * A clone of {@link LazyInitializer}, which doesn't throw any checked exception when get method is invoked.
   *
   * @author Alex Objelean
   * @created 10 Apr 2012
   * @since 1.4.6
   */
  public abstract class LazyInitializer<T> {
    /** Stores the managed object. */
    volatile T object;
  
    /**
     * Returns the object wrapped by this instance. On first access the object is created. After that it is cached and can
     * be accessed pretty fast.
     *
     * @return the object initialized by this {@code LazyInitializer} the object
     */
    public final T get() {
      // use a temporary variable to reduce the number of reads of the volatile field
      T result = object;
  
      if (result == null) {
        synchronized (this) {
          result = object;
          if (result == null) {
            object = result = initialize();
          }
        }
      }
      return result;
    }
  
    /**
     * @return true if the object was already initialized.
     */
    public final boolean isInitialized() {
      return object != null;
    }
  
    /**
     * Creates and initializes the object managed by this {@code LazyInitializer}. This method is called by {@link #get()}
     * when the object is accessed for the first time. An implementation can focus on the creation of the object. No
     * synchronization is needed, as this is already handled by {@code get()}.
     *
     * @return the managed data object
     */
    protected abstract T initialize();
  }
  