"Inappropriate blocking method call"当一个字符串生成器附加另一个字符串生成器时



为什么IntelliJ IDEA显示警告"不适当的阻塞方法调用";当一个StringBuilder附加另一个时?

public Mono<String> doSomethingReactive() {
final StringBuilder sb1 = new StringBuilder("hello");
final StringBuilder sb2 = new StringBuilder("world");
sb1.append(sb2); // This append() causes warning "Inappropriate blocking method call"
sb1.append(sb2.toString()); // ... but this append() is OK :)
return Mono.just(sb1.toString());
}

我怀疑这是IntelliJ IDEA中的一个错误,除非有人给出合理的解释。看见https://youtrack.jetbrains.com/issue/IDEA-282947

我认为它正在阻塞,所以这也许就是intelliJ抱怨的原因。由于您在方法的末尾创建Mono,因此在此之前的所有内容都在Mono流之前或之外执行。它违背了反应流的目的。如果我把单声道放在顶部,那么没有警告:

public Mono<String> doSomethingReactive() {
return Mono.just(new StringBuilder("hello"))
.map(sb1 -> {
StringBuilder sb2 = new StringBuilder("world");
sb1.append(sb2);
sb1.append(sb2.toString());
return sb1.toString();
});
}

在这种情况下,只有第一个StringBuilder的创建在Mono流之外执行。

另外,请注意,我认为intelliJ可能认为sb1.append(sb2)正在调用Object::toString((,当它在VM中缓存类名时,它很可能会被阻塞,而sb1.append(sb2.toString())被称为StringBuilder::toString(,它可能不会执行任何阻塞。

相关内容

最新更新