Spring function util —— SingletonSupplier SupplierUtils

317 阅读1分钟

Spring function util —— SingletonSupplier SupplierUtils

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

Spring 针对 java function 提供了两个工具 API

  • SingletonSupplier
  • SupplierUtils

SingletonSupplier

public class SingletonSupplier<T> implements Supplier<T> {

	// 包装的真正的 Supplier
	@Nullable
	private final Supplier<? extends T> instanceSupplier;

	// 缺省回调
	@Nullable
	private final Supplier<? extends T> defaultSupplier;

	// 包装的实例
	@Nullable
	private volatile T singletonInstance;

	/**
	 * 公开构造
	 */
	public SingletonSupplier(@Nullable T instance, Supplier<? extends T> defaultSupplier) {
		this.instanceSupplier = null;
		this.defaultSupplier = defaultSupplier;
		this.singletonInstance = instance;
	}
	public SingletonSupplier(@Nullable Supplier<? extends T> instanceSupplier, Supplier<? extends T> defaultSupplier) {
		this.instanceSupplier = instanceSupplier;
		this.defaultSupplier = defaultSupplier;
	}

	// 私有构造
	private SingletonSupplier(Supplier<? extends T> supplier) {
		this.instanceSupplier = supplier;
		this.defaultSupplier = null;
	}
	private SingletonSupplier(T singletonInstance) {
		this.instanceSupplier = null;
		this.defaultSupplier = null;
		this.singletonInstance = singletonInstance;
	}

	// 获取最终实例
	@Override
	@Nullable
	public T get() {
		T instance = this.singletonInstance;
		if (instance == null) {
			synchronized (this) {
				instance = this.singletonInstance;

				/**
				 * 先从 instanceSupplier 获取,获取不到就从
				 * 		defaultSupplier 获取
				 */
				if (instance == null) {
					if (this.instanceSupplier != null) {
						instance = this.instanceSupplier.get();
					}
					if (instance == null && this.defaultSupplier != null) {
						instance = this.defaultSupplier.get();
					}
					this.singletonInstance = instance;
				}
			}
		}
		return instance;
	}

	// 该方法不会返回 null 的实例
	public T obtain() {
		T instance = get();
		Assert.state(instance != null, "No instance from Supplier");
		return instance;
	}

	/**
	 * 静态构造
	 */
	public static <T> SingletonSupplier<T> of(T instance) {
		return new SingletonSupplier<>(instance);
	}
	@Nullable
	public static <T> SingletonSupplier<T> ofNullable(@Nullable T instance) {
		return (instance != null ? new SingletonSupplier<>(instance) : null);
	}
	public static <T> SingletonSupplier<T> of(Supplier<T> supplier) {
		return new SingletonSupplier<>(supplier);
	}
	@Nullable
	public static <T> SingletonSupplier<T> ofNullable(@Nullable Supplier<T> supplier) {
		return (supplier != null ? new SingletonSupplier<>(supplier) : null);
	}

}
  • 一个维护单例的 Supplier,可以分别指定

    • instance:单例实例
    • instanceSupplier:单例 Supplier
    • defaultSupplier:缺省回调
  • get 方法获取最终单例实例

  • obtainNullSafeget

  • 提供了一系列静态构造方法

SupplierUtils

public abstract class SupplierUtils {

	/**
	 * NullSafe 获取 Supplier 的实例
	 */
	@Nullable
	public static <T> T resolve(@Nullable Supplier<T> supplier) {
		return (supplier != null ? supplier.get() : null);
	}

}
  • supplier.get()NullSafe 版本
  • 配合 SingletonSupplier 食用更佳

demo

public class SingletonSupplierDemo {

    @Test
    public void test() {

        SingletonSupplier<String> supplier
                = new SingletonSupplier<>(null, () -> "default");
        System.out.println(supplier.get());

        supplier = new SingletonSupplier<>(() -> "dd", () -> "default");
        System.out.println(supplier.get());

        supplier = SingletonSupplier.ofNullable("dd");
        System.out.println(supplier.get());

        supplier = SingletonSupplier.ofNullable(() -> "dd");
        System.out.println(supplier.get());

        System.out.println(SupplierUtils.resolve(supplier));
    }
}

总结

Spring 工具类