/*
 * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package org.glassfish.grizzly.utils;

The object holder, which might be used for lazy object initialization.
Author:Alexey Stashok
/** * The object holder, which might be used for lazy object initialization. * * @author Alexey Stashok */
public abstract class Holder<E> { public static <T> Holder<T> staticHolder(final T value) { return new Holder<T>() { @Override public T get() { return value; } }; } public static IntHolder staticIntHolder(final int value) { return new IntHolder() { @Override public int getInt() { return value; } }; } public static <T> LazyHolder<T> lazyHolder(final NullaryFunction<T> factory) { return new LazyHolder<T>() { @Override protected T evaluate() { return factory.evaluate(); } }; } public static LazyIntHolder lazyIntHolder(final NullaryFunction<Integer> factory) { return new LazyIntHolder() { @Override protected int evaluate() { return factory.evaluate(); } }; } public abstract E get(); @Override public String toString() { final E obj = get(); return obj != null ? "{" + obj + "}" : null; } public static abstract class LazyHolder<E> extends Holder<E> { private volatile boolean isSet; private E value; @Override public final E get() { if (isSet) { return value; } synchronized (this) { if (!isSet) { value = evaluate(); isSet = true; } } return value; } protected abstract E evaluate(); } public static abstract class IntHolder extends Holder<Integer> { @Override public final Integer get() { return getInt(); } public abstract int getInt(); } public static abstract class LazyIntHolder extends IntHolder { private volatile boolean isSet; private int value; @Override public final int getInt() { if (isSet) { return value; } synchronized (this) { if (!isSet) { value = evaluate(); isSet = true; } } return value; } protected abstract int evaluate(); } }