我有一个仅一次只能有一个实例的类。本质上,这是一个单例,当不保留任何外部引用时,该单例将被销毁;在以后需要新引用时,将其重新实例化。
private static readonly WeakReference<Foo> weakInstance = new WeakReference<Foo>(null);
使用上述代码的原因是因为我有本地iOS回调(必须是静态函数),但需要将数据传递给当前实例。
tl; dr 将WeakReference
初始化为null并稍后设置目标是否安全?这是代码气味吗?
编辑: 正如@smolchanovsky指出的那样,我可以在需要设置时实例化弱引用。结果是:
if (weakInstance == null)
{
weakInstance = new WeakReference<Foo>(this);
}
else
{
weakInstance.SetTarget(this);
}
或
// Overwrite the existing WeakReference object
weakInstance = new WeakReference<Foo>(this);
有理由选择其中一个吗?
答案 0 :(得分:2)
为什么不使用它?
StepVerifier.withVirtualTime(() -> {
Mono<String> monoFromSupplier = Mono.fromSupplier(() -> "AA")
.doOnNext(po -> {
System.out.println("monoFromSupplier:onNext " + Thread.currentThread().getName());
});
Mono<String> monoFromWebClient = WebClient.create("http://...")
.get()
.retrieve()
.bodyToMono(String.class)
.doOnNext(po -> {
System.out.println("monoFromWebClient:onNext " + Thread.currentThread().getName());
});
Mono<?> selectedMono = monoFromSupplier;
return selectedMono.repeatWhen(companion -> companion.take(3)
.delayUntil(r -> {
Duration dur = Duration.ofSeconds(500);
System.out.println("delay... " + dur);
return Mono.delay(dur);
}))
.last()
.log();
})
.thenAwait(Duration.ofDays(1))
.expectNextCount(1)
.expectComplete()
.verify();
请注意,这不是线程安全的解决方案。