All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cedarsoft.lang.LazyField Maven / Gradle / Ivy

There is a newer version: 8.1.1
Show newest version
package com.cedarsoft.lang;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * Represents a field that is instantiated on first access
 *
 * @author Johannes Schneider ([email protected])
 */
public class LazyField {
  @Nonnull
  private final ReadWriteLock lock;

  @Nonnull
  private final InstanceFactory instanceFactory;

  @Nullable
  private T instance;

  public LazyField( @Nonnull InstanceFactory instanceFactory ) {
    this( instanceFactory, new ReentrantReadWriteLock() );
  }

  public LazyField( @Nonnull InstanceFactory instanceFactory, @Nonnull ReadWriteLock lock ) {
    this.instanceFactory = instanceFactory;
    this.lock = lock;
  }

  @Nonnull
  public T getInstance() {
    lock.readLock().lock();
    try {
      if ( instance != null ) {
        return instance;
      }
    } finally {
      lock.readLock().unlock();
    }

    lock.writeLock().lock();
    try {
      //noinspection ConstantConditions
      if ( instance != null ) {
        return instance;
      }

      instance = instanceFactory.create();
      return instance;
    } finally {
      lock.writeLock().unlock();
    }
  }

  @Nullable
  public T getInstanceNullable() {
    lock.readLock().lock();
    try {
      return instance;
    } finally {
      lock.readLock().unlock();
    }
  }

  @Nonnull
  public ReadWriteLock getLock() {
    return lock;
  }

  public interface InstanceFactory {
    @Nonnull
    T create();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy