"Неуместный вызов метода блокировки", когда один StringBuilder добавляет другой

0

Вопрос

Почему 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());
}
2
0

Я подозреваю, что это ошибка в IntelliJ IDEA, если только кто-нибудь не даст разумного объяснения. Видишь https://youtrack.jetbrains.com/issue/IDEA-282947

2021-11-19 11:55:19
0

Я думаю, что это блокирует, так что, возможно, именно поэтому IntelliJ жалуется. Поскольку вы создаете Моно в конце метода, все, что предшествует этому, выполняется до или за пределами потока Моно. Это противоречит цели реактивного потока. Если я поставлю Моно вверху, то никакого предупреждения:

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 (), который вполне может блокироваться при кэшировании имени класса в виртуальной машине, тогда как sb1.append(sb2.toString()) вызывается StringBuilder::toString (), который не может выполнять никаких блокировок.

2021-11-19 13:17:47

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................