xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-core-tool/src/main/java/org/springblade/core/tool/utils/Lazy.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
/*
 *      Copyright (c) 2018-2028, DreamLu All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: DreamLu å¢æ˜¥æ¢¦ (596392912@qq.com)
 */
package org.springblade.core.tool.utils;
import org.springframework.lang.Nullable;
import java.io.Serializable;
import java.util.function.Supplier;
/**
 * Holder of a value that is computed lazy.
 *
 * @author L.cm
 */
public class Lazy<T> implements Supplier<T>, Serializable {
   @Nullable
   private transient volatile Supplier<? extends T> supplier;
   @Nullable
   private T value;
   /**
    * Creates new instance of Lazy.
    *
    * @param supplier Supplier
    * @param <T>      æ³›åž‹æ ‡è®°
    * @return Lazy
    */
   public static <T> Lazy<T> of(final Supplier<T> supplier) {
      return new Lazy<>(supplier);
   }
   private Lazy(final Supplier<T> supplier) {
      this.supplier = supplier;
   }
   /**
    * Returns the value. Value will be computed on first call.
    *
    * @return lazy value
    */
   @Nullable
   @Override
   public T get() {
      return (supplier == null) ? value : computeValue();
   }
   @Nullable
   private synchronized T computeValue() {
      final Supplier<? extends T> s = supplier;
      if (s != null) {
         value = s.get();
         supplier = null;
      }
      return value;
   }
}