001/* 002 * Units of Measurement Reference Implementation 003 * Copyright (c) 2005-2021, Jean-Marie Dautelle, Werner Keil, Otavio Santana. 004 * 005 * All rights reserved. 006 * 007 * Redistribution and use in source and binary forms, with or without modification, 008 * are permitted provided that the following conditions are met: 009 * 010 * 1. Redistributions of source code must retain the above copyright notice, 011 * this list of conditions and the following disclaimer. 012 * 013 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions 014 * and the following disclaimer in the documentation and/or other materials provided with the distribution. 015 * 016 * 3. Neither the name of JSR-385, Indriya nor the names of their contributors may be used to endorse or promote products 017 * derived from this software without specific prior written permission. 018 * 019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 021 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 022 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 023 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 026 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 028 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 */ 030package tech.units.indriya.internal.function; 031 032import java.util.Objects; 033import java.util.function.Supplier; 034 035/** 036 * Holder of an instance of type T, supporting the <em>compute-if-absent</em> idiom in a thread-safe manner. 037 * <p> 038 * Not serializable! 039 * 040 * @author Andi Huber 041 * @since 2.0.3 042 */ 043public class Lazy<T> { 044 private final Supplier<? extends T> supplier; 045 private T value; 046 private boolean memorized; 047 048 public Lazy(Supplier<? extends T> supplier) { 049 this.supplier = Objects.requireNonNull(supplier, "supplier is required"); 050 } 051 052 public boolean isMemorized() { 053 synchronized (this) { 054 return memorized; 055 } 056 } 057 058 public void clear() { 059 synchronized (this) { 060 this.memorized = false; 061 this.value = null; 062 } 063 } 064 065 public T get() { 066 synchronized (this) { 067 if(memorized) { 068 return value; 069 } 070 memorized = true; 071 return value = supplier.get(); 072 } 073 } 074 075 public void set(T value) { 076 synchronized (this) { 077 if(memorized) { 078 throw new IllegalStateException( 079 String.format("cannot set value '%s' on Lazy that has already memoized a value", ""+value)); 080 } 081 memorized = true; 082 this.value = value; 083 } 084 } 085 086}