java - Sonar 提示: use StringBuilder instead of StringBuffer

标签 java append sonarqube stringbuilder stringbuffer

我目前正在编写一段代码,它必须能够匹配某些正则表达式,并在与正则表达式匹配的字符串中进行一些替换。

为了做到这一点,我使用 matcher java中的对象。但 正如您在互联网上看到的那样,所有示例都使用 StringBuffer 以便使用appendreplacement和appendtail方法( oracleDoc )进行一些替换。

但是当我推送代码时,Sonar 提示使用 stringbuffer 而不是 stringbuilder。

  • 在这种情况下,Sonar 发出的警告是错误吗?
  • 是否有任何库可以使用 stringbuilder 执行相同的操作?

显然一些开发者对此有所提示here .

我找到了一种不使用 StringBuffer 并使用 StringBuilder 的方法,但我很确定这不如使用 StringBuffer 有效(并且可能是一个不好的做法)。您可以在 junit 测试中复制粘贴以下示例代码:

    String entry = "Actual 4.11-6 and 13-5";
    String expectedReturn = "Actual 4*11^(-6) and 13^(-5)";

    String number = "(^|\\s)-?\\d+((\\.||,)\\d+){0,1}(.\\d+){0,1}-\\d+";
    Pattern pattern = Pattern.compile(number);
    Matcher matcher = pattern.matcher(entry);

    //USING STRING BUFFER
    StringBuffer stringBuffer = new StringBuffer();
    String substring;
    while(matcher.find()){
        substring = matcher.group(0);
        matcher.appendReplacement(stringBuffer,substring.replace(".","*").replace("-","^(-")+")");
    }
    matcher.appendTail(stringBuffer);

    //USING STRING BUILDER
    matcher = pattern.matcher(entry);
    int lastIndex = 0;
    StringBuilder stringBuilder = new StringBuilder();
    while(matcher.find()){
        stringBuilder.append(entry.substring(lastIndex,matcher.start()));
        substring = matcher.group(0);
        stringBuilder.append(substring.replace(".","*").replace("-","^(-")+")");
        lastIndex = matcher.end();
    }
    stringBuilder.append(entry.substring(lastIndex,entry.length()));

    Assert.assertEquals(expectedReturn,stringBuffer.toString());
    Assert.assertEquals(expectedReturn,stringBuilder.toString());

信息:管理追加字符串构建器的匹配器将在 jdk 9 source code 中和 code review

最佳答案

这是警告,而不是错误。 Sonar 会警告您 StringBuilder 更可取 because it is faster 。如果 API 强制您使用 StringBuffer,那么我会使用它并消除警告。

我认为 Pattern 和两个缓冲区的真正根本问题是 StringBufferStringBuilder 不共享用于构建字符串的特定接口(interface)( Appendable 是一个更通用的接口(interface),我认为它们应该共享一个更具体的接口(interface)来构造字符串,例如 StringConstructor),这将允许您零努力地切换实现(通常)。

关于java - Sonar 提示: use StringBuilder instead of StringBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38877546/

相关文章:

java - Sonar 全局 Java Checkstyle 参数覆盖配置文件

java - JSP搜索数据库

java - 如何在 Spring 传递树集的值(value)?

java - 用 lambda 表达式替换列表迭代逻辑

swift - 在文件顶部添加一个字符串

Java StringBuilder 字符追加返回不需要的数字

timeout - Sonar 3.6.1 无法请求 :/batch_bootstrap/properties

java - java中.split()方法如何工作?

python - 为什么追加会用新元素覆盖列表中的所有内容?

sonarqube - 适用于 Sonarqube 5.6.6 LTS 的 SQALE 插件