
com.cedarsoft.lang.LazyField Maven / Gradle / Ivy
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