为什么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(,它可能不会执行任何阻塞。