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
方法获取最终单例实例obtain
是NullSafe
的get
- 提供了一系列静态构造方法
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
工具类