package org.netbeans.gradle.project.util; import java.util.concurrent.atomic.AtomicReference; import org.jtrim.utils.ExceptionHelper; import org.openide.util.Lookup; public final class CachedLookupValue<ValueType> { private final Lookup.Provider provider; private final Class<? extends ValueType> type; private final AtomicReference<ValueType> valueRef; public CachedLookupValue(Lookup.Provider provider, Class<? extends ValueType> type) { ExceptionHelper.checkNotNullArgument(provider, "provider"); ExceptionHelper.checkNotNullArgument(type, "type"); this.provider = provider; this.type = type; this.valueRef = new AtomicReference<>(null); } public ValueType get() { ValueType result = valueRef.get(); if (result == null) { result = provider.getLookup().lookup(type); if (!valueRef.compareAndSet(null, result)) { result = valueRef.get(); } } return result; } }